문제 : https://www.acmicpc.net/problem/2687

 

2687번: 팩스 받기

팩스는 Run-Length Encoding(RLE)라고 불리는 인코딩을 사용한다. RLE란 아주 단순한 데이터 압축으로 데이터를 데이터와 반복된 횟수로 저장하는 방식을 말한다. 이 방식은 상대적으로 단순한 그래픽

www.acmicpc.net

문제 요약 : 해당 문자열을 디코딩하여 출력

 

JAVA

소스코드 : https://github.com/cbkpar/BOJ/blob/main/boj_2687.java

채점 번호 아이디 문제 번호 결과 메모리 시간 언어 코드 길이
34333955 cbkpar 2687 맞았습니다!! 18588KB 240ms Java 11 2106B
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

    public static void main(String args[]) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        int p = Integer.parseInt(br.readLine());
        while (p-- > 0) {
            StringBuilder tsb = new StringBuilder();
            int b = Integer.parseInt(br.readLine());
            char[] ch = new char[b * 2];
            int cnt = 0;
            for (int i = 0; i < (b + 39) / 40; i++) {
                String str = br.readLine();
                int sz = str.length();
                for (int j = 0; j < sz; j++) ch[cnt++] = str.charAt(j);
            }
            cnt = 0;
            for (int i = 0; i < b * 2; ) {
                int repeat = 0;
                if (ch[i] >= 'A' && ch[i] <= 'F') {
                    repeat += ch[i] - 'A' + 10;
                } else {
                    repeat += ch[i] - '0';
                }
                repeat *= 16;
                if (ch[i + 1] >= 'A' && ch[i + 1] <= 'F') {
                    repeat += ch[i + 1] - 'A' + 10;
                } else {
                    repeat += ch[i + 1] - '0';
                }
                if (repeat >= 128) {
                    repeat -= 125;
                    while (repeat-- > 0) {
                        if (cnt % 40 == 0) tsb.append("\n");
                        tsb.append(ch[i + 2] + "" + ch[i + 3]);
                        cnt++;
                    }
                    i += 4;
                } else {
                    repeat++;
                    i += 2;
                    while (repeat-- > 0) {
                        if (cnt % 40 == 0) tsb.append("\n");
                        tsb.append(ch[i] + "" + ch[i + 1]);
                        i += 2;
                        cnt++;
                    }
                }
            }
            sb.append(cnt + "" + tsb);
            if (p > 0) sb.append("\n");
        }
        System.out.println(sb);
    }
}

우선 입력이 80개의 문자로 쪼개져서 들어오기 때문에

나누어진 문자열을 하나의 char[] 배열에 담아준다.

이때 문자는 2개가 하나의 글자를 나타내게 된다.

글자를 하나하나 씩 보며

 

해당 글자의 값을 숫자로 반환하였을 때 의 값을 repeat이라고 할때

반환할경우 8비트의 범위(0~255)의 값을 가지게 된다.

 

1. repeat >= 128(1000 0000)인 경우

repeat-125 번 만큼 다음 글자를 저장한다.

저장 도중 저장된 글자의 길이가 80자로 나눠 나머지가 없을경우 줄내림(\n) 을 더해준다.

 

2. repeat < 128(1000 0000)인 경우

숫자로 반환한 글자의 다음글자 기준으로 repeat+1의 길이의 글자를 저장한다. 

저장 도중 저장된 글자의 길이가 80자로 나눠 나머지가 없을경우 줄내림(\n) 을 더해준다.

+ Recent posts