-
[SWEA] 1928 Base Decoder문제 풀이 2020. 4. 27. 20:01
1928 Base Decoder
풀이)
Encoding 과정이
1. 3byte, 24bit 문자를 집어넣는다
2. 6bit씩 잘라서 아래 표로 encoding한다.
(2^6 = 64 개 문자 표현가능)
이니깐 반대로 decoding하려면
1. 문자를 6bit 이진수로 바꾼다.
2. 24bit가 모였으면, 8bit씩 잘라서 3개의 문자를 만든다.
주의
encoding 한 문자의 값은 아스키 코드의 값과 달라서 변경해줘야한다.
아스키 코드 값.
코드)
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768#include <stdio.h>#include <iostream>#include <string>#include <string.h>using namespace std;int main() {//freopen("input.txt", "r", stdin);int T = 0;scanf("%d", &T);for(int test_case = 1;test_case <=T;test_case++){string s;cin >> s; //decoding할 문자열string temp = ""; //bit저장할 변수printf("#%d ", test_case);for (int i = 0; i <= s.length();i++) {//24bit가 쌓였을 경우(총 4개의 문자를 확인)if (i>0&&i % 4 == 0) {for (int j = 0; j < temp.size(); j+=8) { //8bit씩 잘라서 3문자로 문자로 바꿔준다.int idx = 7;int tmp = 0;for (int t = 0; t <= 7; t++) {if (temp[j + t] == '1') {tmp += 1 << idx;}idx--;}printf("%c", (char)tmp); //decoding한 문자 출력}temp = ""; //3문자 모두 교환했으니 다음 3문자를 위해 초기화}if (i == s.length())continue;//24bit까지 쌓아야할 경우int val = 0;if (s[i] == '+') {val = 62;}else if (s[i] == '/') {val = 63;}else {if (s[i] >= '0' && s[i] <= '9') { //0은 ascii code = 48val = s[i] + 4;}if (s[i] >= 'A' && s[i] <= 'Z') { //A는 ascii code = 65val = s[i] - 65;}if (s[i] >= 'a' && s[i] <= 'z') { //a는 ascii code = 97val = s[i] - 97 + 26;}}//문자를 6비트로 바꾸는 과정for (int j = 5; j >= 0; j--) {if (val & (1 << j)) {temp += "1";}else {temp += "0";}}}printf("\n");}return 0;}cs '문제 풀이' 카테고리의 다른 글
[SWEA] 1949 등산로 조성 (0) 2020.04.29 [SWEA] 2817 부분수열의 합 (0) 2020.04.28 [백준] 17244번 아맞다우산 (0) 2020.04.26 [SWEA] 2805 농작물 수확하기 (0) 2020.04.23 [SWEA] 2806 N-Queen (0) 2020.04.23