[SWEA 1928. Base64 Decoder]
(https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PR4DKAG0DFAUq)
다음과 같이 Encoding 을 한다.
우선 24비트 버퍼에 위쪽(MSB)부터 한 byte씩 3 byte의 문자를 집어넣는다.
버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 [표-1] 의 문자로 Encoding 한다.
입력으로 Base64 Encoding 된 String 이 주어졌을 때, 해당 String 을 Decoding 하여, 원문을 출력하는 프로그램을 작성하시오.
문자열의 길이는 항상 4의 배수로 주어진다.
그리고 문자열의 길이는 100000을 넘지 않는다.
입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 Encoding 된 상태로 주어지는 문자열이다.
테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)
- Base64 인코딩을 우선 제대로 이해하는 것이 중요!
참고하면 좋은 자료 : 코딩하는 오징어 - Base64 인코딩이란?- 입력받은 암호문 캐릭터 하나씩 순회하며 10진수 숫자로 변환
- 10진수 숫자를 2진수로 변환하여 이어붙이기 >>6비트로 길이 맞춰야 함<<
- 8비트 씩 잘라서 10진수로 변환
- ascii 변환으로 캐릭터로 바꿔 저장
package Base64Decoder;
import java.util.*;
import java.io.*;
public class Solution {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int T = Integer.parseInt(br.readLine());
for (int t = 1; t <= T; t++) {
String encode = br.readLine();
char[] arr = encode.toCharArray();
StringBuilder sb = new StringBuilder();
// stringbuilder로 이진수 나열하여 저장하기
for (char c : arr) {
sb.append(binary6bit(decode(c)));
}
// 6비트씩 잘라서 숫자로 변환하기
List<Integer> ascii = new ArrayList<>();
int N = sb.length() / 8; // N번 돌아야 해 (원본 문자열 길이)
for (int i = 0; i < N; i++) {
int startIdx = i * 8;
String part = sb.substring(startIdx, startIdx + 8); // 6개씩 자르기
int asc = Integer.parseInt(part, 2); // 10진수로 변환
ascii.add(asc);
}
// 10진수 -> 문자로 변환
StringBuilder ans = new StringBuilder();
for (int a : ascii) {
ans.append((char) a +"");
}
// 정답 출력
bw.write("#" + t + " " + ans.toString());
bw.flush();
bw.newLine();
}
bw.close();
br.close();
}
public static int decode(char C) {
// 인코딩 표에 따라 문자를 값으로 바꿔주는 메서드
if (C >= 'A' && C <= 'Z') {
return (int) C - 65;
} else if (C >= 'a' && C <= 'z') {
return (int) C - 71;
} else if (C >= '0' && C <= '9') {
return (int) C + 4;
} else if (C == '+') {
return 62;
} else {
return 63;
}
}
public static String binary6bit(int n) {
// 인코딩 표의 값(숫자)을 6비트 이진수로 바꿔주는 메서드
// 1. 2진수로 변환
String tmp = Integer.toBinaryString(n);
// 2. 6비트로 늘려주기
String padding = "";
for (int i = 0; i < (6-tmp.length()); i++) {
padding += "0";
}
return padding + tmp;
}
}
Base64
라이브러리를 이용할 수 있다!
byte[] decodedBytes = Base64.getDecoder().decode(a);
String decoded = new String(decodedBytes);
단 두 줄로 해결 가능 ..