Skip to content

1673: Run Length Encoding

Problem Description

Solution in Java

/**
 * @author Teerapat Phokhonwong
 * @Onlinejudge: URI Online Judge
 * @Categories: DATA STRUCTURES AND LIBRARIES
 * @Problem: 1673 - Run Length Encoding
 * @Link: https://www.urionlinejudge.com.br/judge/en/problems/view/1673
 * @Timelimit: 1 sec
 * @Status: Accepted
 * @Submission: 2/19/18, 4:48:49 PM
 * @Language: Java 7 (OpenJDK 1.7.0) [+2s]
 * @Runtime: 0.064s
 * @Solution:
 * @Note:
 */
package URI.Accepted.DATA_STRUCTURES_AND_LIBRARIES.sourcecode;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;

public class P1673_Run_Length_Encoding {

    static LinkedList<Letter> resultList;

    static class Letter {
        char data;
        int count = 0;

        public Letter(char data, int count) {
            this.data = data;
            this.count = count;
        }
    }

    public static void main(String[] args) throws IOException {
        InputStreamReader ir = new InputStreamReader(System.in, "ISO-8859-1");
        OutputStreamWriter ow = new OutputStreamWriter(System.out, "ISO-8859-1");
        BufferedReader br = new BufferedReader(ir);
        BufferedWriter bw = new BufferedWriter(ow);
        String input;
        while ((input = br.readLine()) != null) {
            if (input.isEmpty()) {
                bw.newLine();
                continue;
            }
            char[] c = input.toCharArray();
            int size = c.length;
            resultList = new LinkedList();
            int count = 1;
            int i = 1;
            while (i < size) {
                if (c[i - 1] == c[i]) {
                    count++;
                } else {
                    resultList.add(new Letter(c[i - 1], count));
                    count = 1;
                }
                i++;
            }
            resultList.add(new Letter(c[i - 1], count));

            String out = "";
            int lastCount = 0;
            for (Letter letter : resultList) {
                if (letter.count == 1) {
                    if (lastCount != 1) {
                        out += '1';
                    }
                    if (letter.data == '1') {
                        out += "11";
                    } else {
                        out += "" + letter.data;
                    }
                    lastCount = 1;
                } else {
                    if (lastCount == 1) {
                        out += '1';
                    }
                    int tmpCount = letter.count;
                    while (tmpCount >= 9) {
                        out += "9" + letter.data;
                        tmpCount -= 9;
                    }
                    if (tmpCount > 0) {
                        if (tmpCount == 1 && letter.data == '1') {
                            out += "1" + "11";
                        } else {
                            out += tmpCount + "" + letter.data;
                        }
                        lastCount = tmpCount == 1 ? 1 : 0;
                    }
                }
            }
            if (lastCount == 1) {
                out += '1';
            }
            bw.append(out + "\n");
        }

        bw.flush();
    }

}