코딩테스트/SWEA

[SWEA] 1928. Base64 Decoder - JAVA

ankisile 2023. 5. 17. 21:37

문제

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PR4DKAG0DFAUq 

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

풀이 

문제의 내용을 요약하면 다음과 같다.

<Encoding> 8bit 3글자 -> 6bit 4글자
<Decoding> 6bit 4글자 -> 8bit 3글자

 

문제에서는 인코딩된 결과값을 주고 다시 디코딩하라고 하였다.

리스트를 이용하여 [표1]을 저장한다. 그리고 입력되는 문자열의 각 글자를 대응하는 값을 6bit씩 연결하고 24bit가 될때마다 8bit 씩 잘라서 아스키코드로 변환한뒤 출력한다.

코드

import java.io.*;
import java.util.*;

public class Solution {
	
	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		ArrayList<Character> list = new ArrayList<>();
		
		for(int i=0;i<26;i++) {
			list.add((char) ('A'+i));
		}
		for(int i=0;i<26;i++) {
			list.add((char) ('a'+i));
		}
		for(int i=0;i<10;i++) {
			list.add((char)(i+'0'));
		}
		list.add('+');
		list.add('/');
		
	
		int T = Integer.parseInt(br.readLine());
		
		for(int test_case = 1; test_case <= T; test_case++)
		{
			
			String str = br.readLine();
			
			String ans = "";
			
			for(int i=0;i<str.length()/4;i++) {
				int b = 0;
				for(int j=i*4;j<(i*4)+4;j++) {
					char ch = str.charAt(j);
					b = (b << 6) | (list.indexOf(ch));					
				}
				for(int j=2;j>=0;j--) {
					char ch = (char) ((b & (255 << 8*j)) >> 8*j);
					ans += ch;	
				}
				
			}
		
			
			System.out.println("#"+test_case+" "+ans);
		}
		
	}

}