ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 한 문자의 값은 아스키 코드의 값과 달라서 변경해줘야한다.


    아스키 코드 값.




    코드)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    #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 = 48
                        val = s[i] + 4;
                    }
                    if (s[i] >= 'A' && s[i] <= 'Z') { //A는 ascii code = 65
                        val = s[i] - 65;
                    }
                    if (s[i] >= 'a' && s[i] <= 'z') { //a는 ascii code = 97
                        val = 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

    댓글

Designed by Tistory.