출처 : 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; }