문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/42892
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
코드:
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
class Node{
int idx;
int x;
int y;
public Node(int idx, int x, int y) {
this.idx = idx;
this.x = x;
this.y = y;
}
}
class Solution {
int[] parents;
int[] left;
int[] right;
int rootNode;
List<Integer> preorderResult = new ArrayList<>();
List<Integer> postorderResult = new ArrayList<>();
public int[][] solution(int[][] nodeinfo) {
int[][] answer = new int[2][nodeinfo.length];
parents = new int[nodeinfo.length + 1];
left = new int[nodeinfo.length + 1];
right = new int[nodeinfo.length + 1];
List<Node> nodeList = new ArrayList<>(nodeinfo.length + 1); // x 오른차순으로 정렬
for (int i = 0; i < nodeinfo.length; i++) {
nodeList.add(new Node(i + 1, nodeinfo[i][0], nodeinfo[i][1]));
}
nodeList.sort(Comparator.comparingInt(o -> o.x));
makeTree(nodeList, -1, 0);
preorder(rootNode);
postorder(rootNode);
for (int i = 0; i < nodeinfo.length; i++) {
answer[0][i] = preorderResult.get(i);
answer[1][i] = postorderResult.get(i);
}
return answer;
}
public void preorder(int parentNode) {
preorderResult.add(parentNode);
if(left[parentNode] > 0) preorder(left[parentNode]);
if(right[parentNode] > 0) preorder(right[parentNode]);
}
public void postorder(int parentNode) {
if(left[parentNode] > 0) postorder(left[parentNode]);
if(right[parentNode] > 0) postorder(right[parentNode]);
postorderResult.add(parentNode);
}
//child: 1:left 2:right
public void makeTree(List<Node> nodeList, int parent, int child) {
if(nodeList.size() < 1) return;
//1. 루트 찾기
int root = 0;
int idx = 0;
int pLevel = Integer.MIN_VALUE;
for (int i = 0; i < nodeList.size(); i++) {
if(pLevel < nodeList.get(i).y){
idx = i;
root = nodeList.get(i).idx;
pLevel = nodeList.get(i).y;
}
}
//2. 정보 저장
if(parent == -1){
rootNode = root;
}
parents[root] = parent;
if(child == 1){
left[parent] = root;
} else if (child == 2) {
right[parent] = root;
}
//3. dfs
makeTree(nodeList.subList(0, idx), root, 1);
makeTree(nodeList.subList(idx + 1, nodeList.size()), root, 2);
}
}
public class Main {
public static void main(String[] args) {
Solution sol = new Solution();
int[][] nodeinfo = {
{5,3},
{11,5},
{13,3},
{3,5},
{6,1},
{1,3},
{8,6},
{7,2},
{2,2}
};
sol.solution(nodeinfo);
}
}
'PS > 프로그래머스' 카테고리의 다른 글
프로그래머스 2020 KAKAO BLIND RECRUITMENT - 괄호 변환[JAVA] (1) | 2023.10.31 |
---|---|
프로그래머스 2020 KAKAO BLIND RECRUITMENT - 문자열 압축[JAVA] (0) | 2023.10.30 |
프로그래머스 2019 KAKAO BLIND RECRUITMENT - 후보키[JAVA] (0) | 2023.10.27 |
프로그래머스 2019 KAKAO BLIND RECRUITMENT - 오픈채팅방[JAVA] (0) | 2023.10.26 |
프로그래머스 2019 KAKAO BLIND RECRUITMENT - 실패율[JAVA] (0) | 2023.10.25 |