Notice
Recent Posts
Recent Comments
«   2024/05   »
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
Archives
Today
Total
관리 메뉴

코린이 탈출기

[2019 KAKAO BLIND RECRUITMENT][JAVASCRIPT] 길 찾기 게임 본문

문제 풀이

[2019 KAKAO BLIND RECRUITMENT][JAVASCRIPT] 길 찾기 게임

명란파스타 2020. 9. 8. 21:41

문제 바로가기

 

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

[[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시간

 

<문제 Logic>

1. nodeInfo 배열에 node 번호를 추가해준다.

2. nodeInfo 배열을 y값 기준으로 내림차순, 같은경우 x값 기준으로 오름차순 정렬한다.

3. myOrder 함수를 재귀적으로 호출하는데, nodeInfo 배열을 돌면서 가장 첫번째 원소의 x값 기준으로 그 값보다 작으면 left 배열에 추가, 크면 right 배열에 추가한다. nodeInfo의 가장 첫번째 원소는 항상 서브트리의 root가 된다.

4. 전위순회인 경우 탐색 순서가 root->left->right 이므로 함수의 첫부분에 써주면 되고, 후위탐색인 경우 탐색순서가 left->right->root이므로 재귀 호출을 다 완료한 다음 제일 마지막에 해주면 된다.

5. nodeInfo의 길이가 0인 경우는 더이상의 서브트리가 존재하지 않는다는 의미이므로 재귀 호출을 중단한다.

 

 

 

-전체 코드-

<!DOCTYPE html>

<body>
    <script>
        let preorder = [];
        let postorder = [];

        function myOrder(nodeinfo, preorder, postorder)
        {
            if(nodeinfo.length == 0)
                return;

            let now_idx = 0;
            let left = [];
            let right = [];

            console.log(nodeinfo);
            
            preorder.push(nodeinfo[now_idx][2]);

            for(let i = now_idx +1; i<nodeinfo.length; i++)
            {
                if(nodeinfo[i][0] < nodeinfo[now_idx][0])//부모노드보다 왼쪽에 위치
                {
                    left.push(nodeinfo[i]);
                }
                else//부모노드보다 오른쪽에 위치
                {
                    right.push(nodeinfo[i]);
                }
            }
            myOrder(left, preorder, postorder);
            myOrder(right, preorder, postorder);

            postorder.push(nodeinfo[now_idx][2]);
        }

        function solution(nodeinfo) {
            var answer = [];
            let graph = [];
            for(var i = 0; i<nodeinfo.length; i++)
            {
                nodeinfo[i].push(i+1);
            }
            
            nodeinfo.sort((a,b)=>{
                if(a[1] < b[1])
                    return 1;
                else if(a[1] > b[1])
                    return -1;
                else{
                    if(a[0] > b[0])
                        return 1;
                    else
                        return -1;
                }
            })

            console.log(nodeinfo);
            
            myOrder(nodeinfo, preorder, postorder)
            
            console.log(preorder);
            console.log(postorder);

            answer.push(preorder);
            answer.push(postorder);

            console.log(answer);
            return answer;
        }

        solution([[5, 3], [11, 5], [13, 3], [3, 5], [6, 1], [1, 3], [8, 6], [7, 2], [2, 2]]);
    </script>
</body>