[Java/알고리즘] SWEA 1928. Base64 Decoder

·2025년 8월 28일
0

문제

[SWEA 1928. Base64 Decoder]

(https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PR4DKAG0DFAUq)
다음과 같이 Encoding 을 한다.

  1. 우선 24비트 버퍼에 위쪽(MSB)부터 한 byte씩 3 byte의 문자를 집어넣는다.

  2. 버퍼의 위쪽부터 6비트씩 잘라 그 값을 읽고, 각각의 값을 아래 [표-1] 의 문자로 Encoding 한다.

표1

입력으로 Base64 Encoding 된 String 이 주어졌을 때, 해당 String 을 Decoding 하여, 원문을 출력하는 프로그램을 작성하시오.

제약 사항

문자열의 길이는 항상 4의 배수로 주어진다.
그리고 문자열의 길이는 100000을 넘지 않는다.

입력

입력은 첫 줄에 총 테스트 케이스의 개수 T가 온다.
다음 줄부터 각 테스트 케이스가 주어진다.
테스트 케이스는 Encoding 된 상태로 주어지는 문자열이다.

출력

테스트 케이스 t에 대한 결과는 “#t”을 찍고, 한 칸 띄고, 정답을 출력한다.
(t는 테스트 케이스의 번호를 의미하며 1부터 시작한다.)


풀이

접근법

  1. Base64 인코딩을 우선 제대로 이해하는 것이 중요!
    참고하면 좋은 자료 : 코딩하는 오징어 - Base64 인코딩이란?
  2. 입력받은 암호문 캐릭터 하나씩 순회하며 10진수 숫자로 변환
  3. 10진수 숫자를 2진수로 변환하여 이어붙이기 >>6비트로 길이 맞춰야 함<<
  4. 8비트 씩 잘라서 10진수로 변환
  5. 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);

단 두 줄로 해결 가능 ..

profile
To Dare is To Do

0개의 댓글