"전무"로 승진한 라이언이 왕따인 이유를 알려주는 문제.
"전무" 라이언이 x, y 좌표값을 주면 우리 친구들이 x, y 를 전부 순회를 마친 팀이 이기는 "라이언만" 재미있는 게임이다.
자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고. 문제풀러가기
x, y 좌표를 가지고 트리를 만들어 순회시키면 끝나는 문제.
모든 요소들은 이진트리를 만족하기 위한 조건을 가지고 있으므로 맘 놓고 트리를 만들면 된다.
리스트로 짜도 되지만 귀찮기 때문에 vector를 이용하여 트리의 정보를 저장한다.
x, y, left, right, 들어올 때 index 를 저장하는 Node 구조체를 생성하고, 트리를 잘 만들어 주면 된다. 트리를 만들기 힘들다고 느껴지면 노트장 펴고 펜으로 먼저 순서를 적어가며 하는 것을 추천함.
프로그래머스 사이트가 아닌, visual studio 에서 코드를 작성해서 그대로 가져온 것 입니다. 일부 테스트 코드가 존재합니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
struct Node {
int x, y;
int left, right;
int myindex;
};
vector<vector<int>> solution(vector<vector<int>> nodeinfo);
void myInsert(int nodeIndex, vector<int> insertNode);
void preorder(vector<int> &vec, Node node);
void postorder(vector<int>& vec, Node node);
bool comp(vector<int> a, vector<int> b) {
if (a[1] == b[1]) return a[0] < b[0];
return a[1] > b[1];
}
vector<Node> tree; // x,y,left,right 를 저장하는 노드를 가진 트리
vector<vector<int>> levelInfo;
int treeIndex;
int main() {
vector<vector<int>> nodeinfo = { {5, 3}, {11, 5}, {13, 3}, {3, 5}, {6, 1}, {1, 3}, {8, 6}, {7, 2}, {2, 2} };
solution(nodeinfo);
}
vector<vector<int>> solution(vector<vector<int>> nodeinfo) {
vector<vector<int>> answer;
for (size_t i = 0; i < nodeinfo.size(); i++)
nodeinfo[i].push_back(i + 1);
sort(nodeinfo.begin(), nodeinfo.end(), comp);
tree.push_back(Node{nodeinfo[0][0], nodeinfo[0][1], -1, -1, nodeinfo[0][2]});
for (size_t i = 1; i < nodeinfo.size(); i++)
myInsert(0, nodeinfo[i]);
//순회
vector<int> preVec,postVec;
preorder(preVec, tree[0]);
postorder(postVec, tree[0]);
answer.push_back(preVec);
answer.push_back(postVec);
return answer;
}
void myInsert(int nodeIndex, vector<int> insertNode){
//x 값을 기준으로 왼쪽 오른쪽 체크한다
if (tree[nodeIndex].x > insertNode[0]) {
if (tree[nodeIndex].left == -1) {
tree.push_back(Node{insertNode[0], insertNode[1], -1, -1, insertNode[2] });
tree[nodeIndex].left = tree.size() - 1;
}
else {
myInsert(tree[nodeIndex].left, insertNode);
}
}
else {
if (tree[nodeIndex].right == -1) {
tree.push_back(Node{insertNode[0], insertNode[1], -1, -1,insertNode[2] });
tree[nodeIndex].right = tree.size() - 1;
}
else {
myInsert(tree[nodeIndex].right, insertNode);
}
}
}
void preorder(vector<int> &vec, Node node) {
vec.push_back(node.myindex);
if(node.left != -1)
preorder(vec,tree[node.left]);
if (node.right != -1)
preorder(vec, tree[node.right]);
}
void postorder(vector<int>& vec, Node node) {
if (node.left != -1)
postorder(vec, tree[node.left]);
if (node.right != -1)
postorder(vec, tree[node.right]);
vec.push_back(node.myindex);
}
문제의 난이도에 비해 정답률이 낮은 것이 좀 의아하다.
내 친구가 라이언 같은 놈이라면 절교한다.