CS/알고리즘_KAKAO BLIND RECRUITMENT

2019 KAKAO BLIND RECRUITMENT : 길 찾기 게임

Jedy_Kim 2021. 9. 29. 12:13
728x90

https://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

// 코드

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
import java.util.*;
 
class Solution {
    
    class Node {
        
        int id;
        int x, y;
        Node left;
        Node right;
        
        Node(int id, int x, int y) {
            this.id = id;
            this.x = x;
            this.y = y;
        }        
    };
    
    int idx = 0;
    List<Node> Nodes = new ArrayList<Node>();    
    // y가 큰 순서대로 y가 같으면 x가 작은 순서대로 정렬이된다.
    Comparator<Node> Comp = new Comparator<Node>() {
        public int compare(Node a, Node b) {
            if(a.y == b.y) {
                return a.x - b.x;
            }
            return b.y - a.y;
        }
    }; 
    
    // 트리노드를 추가한다.
    void addNode(Node parent, Node child) {
        if(child.x < parent.x) { // 왼쪽 자식노드 추가
            if(parent.left == null) parent.left = child;
            else addNode(parent.left, child);
        } else { // 오른쪽 자식노드 추가
            if(parent.right == null) parent.right = child;
            else addNode(parent.right, child);
        }
    }
    
    // 전위순회
    void preOrder(int[][] answer, Node node) {
        if(node == nullreturn;
        
        answer[0][idx++= node.id;
        preOrder(answer, node.left);
        preOrder(answer, node.right);        
    } 
    
    // 후위순회    
    void postOrder(int[][] answer, Node node) {
        if(node == nullreturn;
                
        postOrder(answer, node.left);
        postOrder(answer, node.right);
        answer[1][idx++= node.id;
    }
    
    // main
    public int[][] solution(int[][] nodeinfo) {
        
        // 노드들을 생성한다.
        int size = nodeinfo.length;
        for(int i=0; i<size; i++) {
            Nodes.add(new Node(i+1, nodeinfo[i][0], nodeinfo[i][1]));
        }
        
        // y가 큰 순서대로 y가 같으면 x가 작은 순서대로 정렬
        Nodes.sort(Comp);
        
        // 이진트리를 완성한다.
        Node root = Nodes.get(0);
        for(int i=1; i<size; i++) {            
            addNode(root, Nodes.get(i));
        }
        
        // 전위/후위 순회 
        int[][] answer = new int[2][size];
        preOrder(answer, root);
        idx = 0;
        postOrder(answer, root);
        
        return answer;
    }
}
cs

// 복습

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
import java.util.*;
 
class Solution {
    
    class Node {
        int id;
        int x, y;
        Node left;
        Node right;
        
        Node(int id, int x, int y) {
            this.id = id;
            this.x = x;
            this.y = y;            
        }        
    }
    
    List<Node> Nodes = new ArrayList<>();
    Comparator<Node> Comp = new Comparator<>() {
        public int compare(Node a, Node b) {
            if(a.y == b.y) return a.x - b.x;
            return b.y - a.y;
        }
    };
    int idx = 0;
    
    // 트리노드를 추가한다.
    void addNode(Node parent, Node child) {
        // 왼쪽 자식노드에 추가
        if(child.x < parent.x) {
            if(parent.left == null) parent.left = child;
            else addNode(parent.left, child);
        }
        // 오른쪽 자식노드에 추가
        else {
            if(parent.right == null) parent.right = child;
            else addNode(parent.right, child);
        }
    }
    
    // 전위순회
    void preOrder(int[][] answer, Node node) {
        if(node == nullreturn;
        
        answer[0][idx++= node.id;
        preOrder(answer, node.left);
        preOrder(answer, node.right);
    }
    
    // 후위순회
    void postOrder(int[][] answer, Node node) {
        if(node == nullreturn;
                
        postOrder(answer, node.left);
        postOrder(answer, node.right);
        answer[1][idx++= node.id;
    }
    
    public int[][] solution(int[][] nodeinfo) {
        
        // 노드들을 생성한다.
        int size = nodeinfo.length;
        for(int i=0; i<size; i++) {
            Nodes.add(new Node(i+1, nodeinfo[i][0], nodeinfo[i][1]));
        }
        
        // y가 큰 순서대로, y가 같다면 x가 작은 순서대로 정렬한다.
        Nodes.sort(Comp);
        
        // 이진트리를 완성한다.
        Node root = Nodes.get(0); // root
        for(int i=1; i<size; i++) {
            addNode(root, Nodes.get(i));
        }
        
        // 전위, 후위 순회
        int[][] answer = new int[2][size];
        preOrder(answer, root);
        idx = 0;
        postOrder(answer, root);
        
        return answer;
    }
}
cs

 

반응형