ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 카카오 1차 온라인 코딩테스트 1번 문제(17.09.16)
    💻 프로그래밍/알고리즘 2017. 10. 3. 23:15

    안녕하세요 JAY 입니다!! 


    카카오톡 1차 온라인 코딩테스트 1번문제를 한번 풀어보도록 하겠습니다.


    정확한 문제풀이와 문제내용은 아래 링크로 가보시면 카카오에서 포스팅한 문제풀이 내용이 있습니다.


    제 글에서는 문제는 따로 설명하지 않고 풀이에 대해서 설명드리겠습니다.


    문제 및 풀이 링크 : http://tech.kakao.com/2017/09/27/kakao-blind-recruitment-round-1/


    1. 비밀 지도(난이도: 하)

    이 문제의 경우 크게 두가지만 생각하면 됬습니다.

    - vector<int> 값을 vector<string>으로 출력

    - 입력으로 들어오는 map1, map2를 비교해 벽(#)이 하나라도 있으면 answer는 벽(#) -> OR연산

      공백(" ")은 map1, map2 둘 다 공백(" ")일 경우에만 공백(" ") -> AND연산

    이 두가지만 만족하는 알고리즘을 설계하면 문제는 쉽게 풀립니다.

    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
    #include <iostream>
    #include <vector>
    #include <string>
     
    using namespace std;
    string intToString(int n, int input);
    vector<string> solution(int n, vector<int> arr1, vector<int> arr2);
    int main(void)
    {
        vector<string> test(5);
        int iArr1[5= {920281811};
        int iArr2[5= {301211728};
        vector<int> arr1(iArr1, iArr1 + (sizeof(iArr1) / sizeof(iArr1[0])));
        vector<int> arr2(iArr2, iArr2 + (sizeof(iArr2) / sizeof(iArr2[0])));
        
        test = solution(5, arr1, arr2);
     
        return 0;
    }
     
    vector<string> solution(int n, vector<int> arr1, vector<int> arr2) {
        vector<string> answer;
        string num1 = "";
        string num2 = "";
        string result = "";    
        
        for(int i = 0; i < n; i ++) {
            result = "";
            num1 = intToString(n, arr1[i]);
            num2 = intToString(n, arr2[i]);
     
            for(int j = 0; j < n; j ++) {
                if(num1[j] == '#' || num2[j] == '#') result += '#';
                else if(num1[j] == ' ' && num2[j] == ' ') result += ' ';
            }
            answer.push_back(result);
        }
        
        /*********** 결과 출력 하기 위한 코드 ***********/
        vector<string>::iterator vi;
        for(vi=answer.begin(); vi!=answer.end(); vi++)
            cout << *vi << endl;
        /*********************************************/
     
        return answer;
    }
     
    string intToString(int n, int input)
    {    
        unsigned int x = 0x1;
         string outStr = "";
        
        for(int i = n - 1; i >= 0; i --) {
            if(x & input) outStr += '#';      
            else outStr += " ";
            x = (x << 1);
        }
        
        reverse(outStr.begin(), outStr.end());
        return outStr;
    }
     


    저는 입력된  vector<int>의 원소를 먼저 string값으로 바꾼다음 다시 비교하여 vector<string>으로 결과를 출력하였습니다.. 사실 이렇게 안하고 바로 두 map의 값을 비교해서 결과를 출력할 수 도 있는데, 저는 위와같이 하는 방식으로 처음 생각이 났습니다. 카카오측에서는 bit연산을 하는 방법을 보기위해 이 문제를 냈다고 합니다. 그냥 바로 두 입력을 비교해서 출력하는 것은 여러분께서 한번 해보시길 바랍니다. 


    이상으로 카카오 1차 온라인 코딩테스트 1번문제 풀이를 마치겠습니다.

    혹시 제가 잘못 알려드리거나, 이건 아니다 싶은게 있으면 바로 댓글로 남겨주시면 감사드리겠습니다!!!

    여러분 즐거운 코딩하시고~!  좋은 코드 생산하세요~~!! Hava a good day!!

    댓글

운동하는 개발자 JAY-JI