본문 바로가기
Log/private

2021 카카오 채용연계형 인턴십 코딩테스트 후기

by HenryNoh 2021. 5. 12.

결론부터 말하자면 역시 카카오는 인턴 코테도 어렵다.

개인적으로 느끼기엔 이전 인턴십 코딩 테스트에 비해서는 난이도가 낮았던 편인 것 같다.
다만 나는 테스트케이스를 다 못 잡아서 광탈할 것이 지금도 뻔히 보이기는 하지만 그래도 나름 여태까지 나왔던 카카오 중에서는 제일 쉬웠다고 생각이 든다. (2018 공채 제외)

아직 프로그래머스에 문제가 공개되진 않았지만 카카오는 문제에 관련된 모든 내용을 써도 상관이 없으니 조금 자세히 기술해보려 한다.

1번은 구현 문제였다.

문자열을 입력받아 해당 문자열을 숫자로 변환하여 출력하는 문제였다.
예를 들어 1five6seven 과 같은 문자열이 들어오면 1567로 return 하는 문제였다.
풀이 방법이야 워낙 다양하게 나올 수 있는 문제였고 다른 함정도 없을 것으로 보여서 그냥 빠르게 구현하여 제출하니 10분? 정도 만에 테스트 케이스를 모두 통과하였다.

별다른 시간제한도 없었어서 c++ map에 zero ~ nine까지 모두 입력한 후에 그걸 찾으면서 답을 만들어 주었다.

#include <string>
#include <map>
#include <vector>

using namespace std;

int solution(string s)
{
    int answer = 0;
    string temp = "";
    map<string, int> p;
    p.insert(pair<string, int>("zero", 0));
    p.insert(pair<string, int>("one", 1));
    p.insert(pair<string, int>("two", 2));
    p.insert(pair<string, int>("three", 3));
    p.insert(pair<string, int>("four", 4));
    p.insert(pair<string, int>("five", 5));
    p.insert(pair<string, int>("six", 6));
    p.insert(pair<string, int>("seven", 7));
    p.insert(pair<string, int>("eight", 8));
    p.insert(pair<string, int>("nine", 9));

    for (int i = 0; i < s.size(); i++)
    {
        if (isalpha(s[i]) != 0)
        {
            temp += s[i];
            for (auto iter = p.begin(); iter != p.end(); iter++)
            {
                if (temp == (*iter).first)
                {
                    answer = answer * 10 + (*iter).second;
                    temp = "";
                    break;
                }
            }
        }
        if (isdigit(s[i]) != 0)
        {
            temp = s[i];
            answer = answer * 10 + stoi(temp);
            temp = "";
        }
    }
    return answer;
}

 

2번은 지금도 왜 테스트 케이스가 3개를 틀렸는지 모르겠는 문제다.

당연히 내가 잘못 풀었겠지만.. 테케 3개를 틀렸는데 문제는 좀 길어서 프로그래머스 사이트에 올라오면 그때 첨부하도록 하겠다. (코로나 시대에 맞는.. 거리두기 문제?)

나는 반복문 3번을 이용하여 완전탐색으로 해결하였다.

해당 문제를 풀면서 알면 좋을 것 같은 것은 맨해튼 거리이다.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<vector<string>> g_places;

int dis(int a, int b, int c, int d)
{
    return abs(a - b) + abs(c - d);
}

vector<int> solution(vector<vector<string>> places)
{
    vector<int> answer;
    g_places = places;
    for (int i = 0; i < 5; i++)
    {
        vector<pair<int, int>> P;
        int flg = 1;
        for (int j = 0; j < 5; j++)
        {
            for (int k = 0; k < 5; k++)
            {
                if (places[i][j][k] == 'P')
                    P.push_back(pair<int, int>(j, k));
            }
        }
        for (int j = 0; j < P.size(); j++)
        {
            for (int k = j + 1; k < P.size(); k++)
            {

                int a = P[j].first;
                int b = P[j].second;
                int c = P[k].first;
                int d = P[k].second;
                int distance = dis(a, c, b, d);
                if (distance == 1)
                {
                    flg = 0;
                    break;
                }
                else if (distance == 2)
                {
                    int a = P[j].first;
                    int b = P[j].second;
                    int c = P[k].first;
                    int d = P[k].second;
                    if (a == c && places[i][a][(a + c) / 2] == 'O')
                    {
                        flg = 0;
                        break;
                    }
                    else if (b == d && places[i][b][(b + d) / 2] == 'O')
                    {
                        flg = 0;
                        break;
                    }
                    else if (a != c && b != d && (places[i][a][d] == 'O' || places[i][b][c] == 'O'))
                    {
                        flg = 0;
                        break;
                    }
                }
            }
        }
        if (flg == 0)
            answer.push_back(0);
        else if (flg == 1)
            answer.push_back(1);
    }
    return answer;
}

 

3번은 정확성 테스트케이스테스트 케이스 3개 효율성 테스트 케이스 5개를 틀렸다.

원본 표와 입력에 따라 들어온 표에 대한 바뀐 결과를 비교하여 달라진 것과 같은 것을 비교하여 문자열에 저장한 후 return 하는 문제였다.

예외 부분도 처리 잘한 것 같았고 다른 부분들도 해결한 것 같았는데.. 좀 많이 아쉽긴 하다.

#include <string>
#include <vector>
#include <stack>

using namespace std;

string solution(int n, int k, vector<string> cmd)
{
    string answer = "";
    vector<int> v(n, 0);
    for (int i = 0; i < n; i++)
        v[i] = i;
    stack<int> s;
    int cur = k;

    for (int i = 0; i < cmd.size(); i++)
    {
        if (cmd[i][0] == 'D')
        {
            string temp = "";
            for (int j = 2; j < cmd[i].size(); j++)
                temp += cmd[i][j];
            int num = stoi(temp);
            int idx = 0;
            while (idx < num)
            {
                if (v[cur + 1] == -1)
                    cur++;
                else
                {
                    cur++;
                    idx++;
                }
            }
        }
        else if (cmd[i][0] == 'U')
        {
            string temp = "";
            for (int j = 2; j < cmd[i].size(); j++)
                temp += cmd[i][j];
            int num = stoi(temp);
            int idx = 0;
            while (idx < num)
            {
                if (v[cur - 1] == -1)
                    cur--;
                else
                {
                    cur--;
                    idx++;
                }
            }
        }
        else if (cmd[i][0] == 'C')
        {
            if (cur == n - 1)
            {
                v[cur] = -1;
                s.push(cur);
                while (v[cur] == -1)
                    cur--;
            }
            else
            {
                v[cur] = -1;
                s.push(cur);
                while (v[cur] == -1)
                    cur++;
            }
        }
        else if (cmd[i][0] == 'Z')
        {
            int add = s.top();
            s.pop();
            v[add] = add;
        }
    }

    for (int i = 0; i < n; i++)
    {
        if (v[i] != i)
            answer.push_back('X');
        else
            answer.push_back('O');
    }
    return answer;
}

 

4번은 테스트 시간 끝난 지 10초 후에 해결했다..

아.. 진짜 솔직히 그렇게 어렵지 않은 dfs 문제였고 충분히 풀만했는데 노드와 간선이 주어지니 visit 배열을 1차원을 만든다는 생각에 사로잡혀서 1시간가량을 날려먹고 시간 끝나기 2분 전에 문득 visit 배열을 2차원으로 만들 수 있다는 생각에 바로 고쳐서 제출하려 해 보았지만 테스트 시간이 끝났었다.

#include <iostream>
#include <string>
#include <vector>

using namespace std;

vector<vector<int>> map;
vector<vector<int>> v;
vector<int> g_trap;

int sum;
int answer;

void dfs(int n, int s, int e)
{
    if (s == e)
    {
        if (sum < answer)
            answer = sum;
        return;
    }
    else
    {
        if (g_trap[s] == 1)
        {
            for (int i = 1; i <= n; i++)
            {
                if (map[s][i] != 0)
                {
                    map[i][s] = map[s][i];
                    map[s][i] = 0;
                }
                else if (map[i][s] != 0)
                {
                    map[s][i] = map[i][s];
                    map[i][s] = 0;
                }
            }
        }

        for (int i = 0; i < map[s].size(); i++)
        {
            if (map[s][i] != 0 && v[s][i] == 0)
            {
                v[s][i] = 1;
                sum += map[s][i];
                dfs(n, i, e);
                sum -= map[s][i];
            }
        }
    }
}

int solution(int n, int start, int end, vector<vector<int>> roads, vector<int> traps)
{
    answer = 2000000000;
    sum = 0;
    map = vector<vector<int>>(n + 1, vector<int>(n + 1, 0));
    v = vector<vector<int>>(n + 1, vector<int>(n + 1, 0));
    g_trap = vector<int>(n + 1, 0);

    for (int i = 0; i < roads.size(); i++)
        map[roads[i][0]][roads[i][1]] = roads[i][2];
    for (int i = 0; i < traps.size(); i++)
        g_trap[traps[i]] = 1;
    dfs(n, start, end);
    return answer;
}

위 코드가 맞는지 아닌지는 모르겠지만 나중에 문제가 올라오면 제출해봐야겠다.

5번은 꽤나 어려웠던 것으로 기억하는데 솔직히 1, 2, 3, 4번 전부 그렇게 어려운 문제들이 아니어서 5번까지도 푼 사람이 상당히 많을 것으로 생각한다. 아쉽지만.. 다음 기회를 노려야겠다!

상반기 공채는 모두 광탈..!ㅜㅜ

댓글