문제 : 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) 을 더해준다.
'백준온라인' 카테고리의 다른 글
| [백준온라인] 27516번 과녁 맞추기 (0) | 2023.03.01 |
|---|---|
| [백준온라인] 12933번 오리 (0) | 2021.10.13 |
| [백준온라인] 2686번 팩스 (0) | 2021.10.13 |
| [백준온라인] 16634번 Run-Length Encoding, Run! (0) | 2021.10.12 |
| [백준온라인] 13772번 Holes (0) | 2021.08.09 |