본문으로 바로가기

출처 : programmers.co.kr/learn/courses/30/lessons/42892

 

코딩테스트 연습 - 길 찾기 게임

[[5,3],[11,5],[13,3],[3,5],[6,1],[1,3],[8,6],[7,2],[2,2]] [[7,4,6,9,1,8,5,2,3],[9,6,5,8,1,4,3,2,7]]

programmers.co.kr

 

고려사항

  • 한 번 꼬은 x 좌표 기준의 이진 탐색 트리, 순회 문제!
  • y 좌표 : ( 노드 번호, x 좌표 ) 꼴로 정보 취합하기. ( 69 - 72 )
  • y 좌표가 큰 순서로 이진 트리에 삽입!
  • 주의 - 트리의 높이는 1000 이하지만, y 좌표의 값은 0 ~ 100000 까지 가능하다.
    62 라인 처럼 10001 크기의 벡터를 선언하거나 map 자료 구조를 사용하면 된다.
    ( 인덱스, 레벨이 큰 순서부터 집어넣어야 해서 편하게 벡터로 구현했다. map 의 역순탐방이 가능하면 map 사용이 좋을지도.. )
  • 27 -32, 34 - 39 라인 처럼 다음 노드를 삽입할 때,
    cur->left, right 가 NULL 이라면 , cur->left, right = newNode 연결 해줘야 한다.
    처음 코드는 while(cur) 의 조건을 믿고, cur = cur->left, right 로 탐방을 하다가
    빈 공간, NULL 이라면 while을 빠져나오고 cur = newNode 를 했더니 트리 구성이 안되었었다..

 

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
struct node{
int num;
int x;
node *left;
node *right;
node(int newNum, int newX){
num = newNum;
x = newX;
left = NULL;
right = NULL;
}
};
void insert(node *cur, int newNum, int newX){
node *newNode = new node(newNum, newX);
while(cur){
if(cur->x > newX){
if(cur->left){
cur = cur->left;
}else{
cur->left = newNode;
break;
}
}else{
if(cur->right){
cur = cur->right;
}else{
cur->right = newNode;
break;
}
}
}
}
void preorder(node *cur, vector<int> &v){
if(cur){
v.push_back(cur->num);
preorder(cur->left, v);
preorder(cur->right, v);
}
}
void postorder(node *cur, vector<int> &v){
if(cur){
postorder(cur->left, v);
postorder(cur->right, v);
v.push_back(cur->num);
}
}
vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
vector<vector<int>> answer;
vector<pair<int, int>> info[100001];
vector<int> pre;
vector<int> post;
int len = nodeinfo.size();
int level = -1;
node *root;
for(int i=0;i<len;++i){
info[nodeinfo[i][1]].push_back({i+1, nodeinfo[i][0]});
level = max(level, nodeinfo[i][1]);
}
root = new node(info[level][0].first, info[level][0].second);
for(int i=level-1;i>=0;--i){
for(pair<int, int> p : info[i]){
insert(root, p.first, p.second);
}
}
preorder(root, pre);
postorder(root, post);
answer.push_back(pre);
answer.push_back(post);
return answer;
}