본문 바로가기

알고리즘/Kakao

[카카오 코딩 테스트] 길 찾기 게임

https://tech.kakao.com/2018/09/21/kakao-blind-recruitment-for2019-round-1/

 

2019 카카오 신입 공채 1차 코딩 테스트 문제 해설

작년에 이어 올해도 블라인드 전형으로 카카오 개발 신입 공채가 시작되었습니다! 그 첫 번째 관문으로 1차 온라인 코딩 테스트가 지난 9월 15일(토) 오후 2시부터 7시까지 5시간 동안 치러졌는데요. 지원자분들 만큼이나 준비위원들도 테스트가 문제없이, 공정하게 치러질 수 있도록 많은 준비를 했고 두근 거리는 마음으로 끝까지 온라인 테스트를 모니터링했답니다. 문제는 작년과 비슷하게 구현 문제 위주로 쉬운 난이도에서 어려운 […]

tech.kakao.com

처음에 엄청 복잡하게 생각해서 여러 시행착오를 겪은 문제입니다.. ㅠㅠ 

tree를 vector double array로 만들수 있다고 생각했던게 문제였네요

 

단순하게 생각하면 오히려 쉽게 해결할 수 있는 문제였습니다. 

1. 정렬을 합니다! -> y가 큰 순서, 그다음은 x가 작은 순서

2. 그 순서대로 tree에 넣어줍니다.

  2-1. bst처럼 부모노드보다 작으면 left, 크면 right child로 재귀형태로 넣어줍니다.

3. preorder, postorder 수행 

끝!

 

간만에 포인터를 활용해봤네요.

이런 tree문제를 제가 많이 접하지 못해서 해결에 애를 먹었던 것 같습니다.. ㅠㅠㅠㅠ

 

쨋든!

아래는 풀이한 코드입니다:)

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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<vector<int>> answer(2);
struct NodeInfo{
    int x, y, n; // n = 노드번호
};
 
struct Tree {
    NodeInfo node;
   Tree *left;
   Tree *right;
};
 
bool cmp(NodeInfo a, NodeInfo b) {
    if (a.y > b.y) return true;
    else {
        if (a.y == b.y && a.x < b.x) return true;
        else return false;
    }
}
 
// 작으면 왼쪽노드, 크면 오른쪽노드에 넣기
void add(Tree *&t, Tree *tmp) {
    if (t == NULL) {
        t = tmp;
        return;
    }
    if (tmp->node.x < t->node.x)
        add(t->left, tmp);
    else
        add(t->right, tmp);
}
 
void preorder(Tree *t) {
    if (t != NULL) {
        answer[0].push_back(t->node.n);
        preorder(t->left);
        preorder(t->right);
    }
}
void postorder(Tree *t) {
    if (t != NULL) {
        postorder(t->left);
        postorder(t->right);
        answer[1].push_back(t->node.n);
    }
}
 
vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
 
    // 뒤죽박죽인 노드 정보들을 y를 기준으로 내림차순 정렬
    vector<NodeInfo> nodes;
    for (int i = 0; i < nodeinfo.size(); i++
        nodes.push_back({nodeinfo[i][0],nodeinfo[i][1],i+1});
 
    sort(nodes.begin(), nodes.end(), cmp);
 
    // Tree에 노드 넣기!
    // 최 상단 노드부터(부모) 차례대로
   Tree *= new Tree;
    t->node = nodes[0];
    t->left = NULL;
    t->right = NULL;
    for (auto node : nodes) {
        if (node.n == nodes[0].n) continue;
       Tree *tmp = new Tree;
        tmp->node = node;
        tmp->left = NULL;
        tmp->right = NULL;
        add(t, tmp);
    }
    preorder(t);
    postorder(t);
    return answer;
}
 
int main() {
    vector<vector<int>> result = solution({ 
{53},{115},{133},{35},
{61},{13},{86},{72},{22} });
    for (auto x : result) {
        for (auto y : x)
            cout << y << ' ';
        cout << endl;
    }
    return 0;
}
cs

 

질문이나 지적사항은 댓글 부탁드립니다:)