1928. Base64 Decode ๋ฌธ์ ๋ฅผ ๋ณด๋ฉด ์ ๋ต๋ฅ ์ด ๊ต์ฅํ ๋๋ค.
ํ๋ง๋๋ก Base64 ์ธ์ฝ๋ฉ ๋ ๋ฌธ์์ด์ ๋์ฝ๋ฉํด์ ์ถ๋ ฅํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ๋ผ์ java.util.Base64 ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๊ฒ ํ๋ฆฐ๋ค.
๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฐ๋ ๊ฑด ๋ช ์ค๋ก ํ๋ฆฌ๋๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ๊ตฌํํ๋ฉด ์ด๋ป๊ฒ ๋๋ ๋ดค๋ค.
final String base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
int[] base64Mapping = new int[64];
for (int i = 0; i < base64Chars.length(); i++) {
base64Mapping[base64Chars.charAt(i)] = i;
}
StringBuilder result = new StringBuilder();
int accum = 0;
int count = 0;
for (char c : base64EncodedString.toCharArray()) {
accum = (accum << 6) | base64Mapping[c];
count++;
if (count == 4) {
result.append((char) (accum >> 16));
result.append((char) ((accum >> 8) & 0xFF));
result.append((char) (accum & 0xFF));
accum = 0;
count = 0;
}
}
๋์ฝ๋ฉ์ ํ๋ ค๋ฉด ๋น์ฐํ ๋์นํ๊ฐ ์์ด์ผํ๋ค. base64Chars๋ฅผ base64Mapping์ผ๋ก ๋ฃ๋๊ฒ ํ๋ฅผ ๋ฐฐ์ด๋ก ๋ง๋ค์ด์ฃผ๋ ์์ ์ด๋ค. Base64์์ = ๋ ๋์ ์๋ ค์ฃผ๋ ๋ฌธ์์ธ๋ฐ ์ด๊ฑด ๊ณ ๋ คํ์ง์์๋ค. ๋ฐ๋ผ์ ํจ๋ฉ๋ ๊ณ ๋ คํ์ง ์์ ์ฝ๋์ด๋ฏ๋ก ์์ ๊ตฌํ๋ง ๋ณด๋๋ก ํ์.
Text content | M | a | n | |||||||||||||||||||||
ASCII | 77 | 97 | 110 | |||||||||||||||||||||
Bit pattern | 0 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 0 |
Index | 19 | 22 | 5 | 46 | ||||||||||||||||||||
Base64-Encoded | T | W | F | u |
์ธ์ฝ๋ฉ ๊ณผ์ ์ด๋ค. ASCII๋ก ๋ณํํ ๋ฌธ์์ด์ 8bit๋ก ๋ฐ๊พผ๋ค์, 6๋นํธ๋ก ๋์ด์ ํ์ ๋ฃ์ด ๋๋ฆฐ๋ค.(์์์ ํฌ๊ธฐ 64์ง๋ฆฌ ๋ฐฐ์ด)
๊ทธ๋ผ ๋์ฝ๋ฉ ๊ณผ์ ์ ์ญ์์ผ๋ก ์งํํ๋ฉด๋๋ค. accum << 6 | base64Mapping[c]๊ฐ ๊ทธ ์ฐ์ฐ์ด๋ค.
count๋ฅผ ์ฐ๋๊ฑด 6*4 -> 8*3์ผ๋ก ๋ฐ๊พธ๋ ๊ณผ์ ์ด๋ผ๊ณ ์๊ฐํ๋ฉด๋๋ค. ์ฆ 24bit์ง๋ฆฌ ๋ฒํผ๋ฅผ ํ๋ ์ฌ์ฉํ๋ ๋นํธ์ฐ์ฐ์ด๋ค.
- count๊ฐ 4๊ฐ ๋๋ค๋๊ฑด accum์ 24๋นํธ๊ฐ ์ฐจ์๋ค๋ ๋ง
- accum์ ์์ 8bit๋ฅผ char๋ก ๋ฐ๊ฟ์ ์ถ๊ฐ
- ๊ทธ๋ค์ 8bit์ char๋ก ๋ฐ๊ฟ์ ์ถ๊ฐ, & 0xFF๋ 64bit 2์งํ์๋ก 0000000011111111์ธ๋ฐ AND์ฐ์ฐ์ ํตํด 8bit๋ก ์ค์ฌ์ฃผ๋ ์ญํ ์ ํ๋ค.
- ๋จ์ accum 8bit๋ ์ฒ๋ฆฌํด์คฌ์ผ๋ฉด, accum, count์ 0์ ๋ฃ์ด ๋ค์ ์ฒ์๋ถํฐ ์์ํ๋ค.
์ด ๊ณผ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด๋ค๋ฉด
import java.util.Base64;
String input = sc.nextLine();
Base64.Decoder decoder = Base64.getDecoder();
byte[] decodedBytes = decoder.decode(input);
String decodedString = new String(decodedBytes, "UTF-8");
๊ฐ๋จํ๊ฒ ํด๊ฒฐํ ์ ์์ง๋ง ์ต์ํ์ง์์ Base64.Decoder ์ด ๋ถ๋ถ์ ๊ธฐ์ตํด์ผํ๋ค. ๊ทธ๋ ์ง๋ง ํ์ ๋์ํ๋ ๋ฐฐ์ด์ ๋ง๋ค ํ์๋ ์๊ณ ๋๋จธ์ง ์์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ค ์์์ ํด์ค๋ค.
์ถ์ฒ: https://ko.wikipedia.org/wiki/%EB%B2%A0%EC%9D%B4%EC%8A%A464
๋์์ด ๋๋ค๋ฉด ๋๊ธ์ด๋ ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์ธ์! ๋ก๊ทธ์ธ ์ํด๋ ๋ฉ๋๋ค ^_^
'OJ๐ผ > ์ค๋ต๋ ธํธ๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SWEA][JAVA] 1970. ์ฌ์ด ๊ฑฐ์ค๋ฆ๋(D2์์ ๋ฐ์ํ ์๊ฐ์ด๊ณผ) (0) | 2023.11.14 |
---|---|
[SWEA][JAVA] ์ด์ฌ์์ ํ๋ฌธ ๊ฒ์ฌ (0) | 2023.11.05 |
[SWEA][JAVA] 10/28 - D1 ๋ฐ๊ธฐ (0) | 2023.10.28 |
[BOJ][JAVA] 10448: ์ ๋ ์นด ์ด๋ก (0) | 2023.10.21 |
[BOJ][JAVA] 10989: ์ ์ ๋ ฌํ๊ธฐ 3 (0) | 2023.10.19 |