본문 바로가기

알고리즘

프로그래머스 길 찾기 게임

반응형
class Solution {
        fun solution(nodeinfo: Array<IntArray>): Array<IntArray> {

            val list = ArrayList<Point>()
            for (i in nodeinfo.indices) {
                val info = nodeinfo[i]
                list.add(Point(info[0],info[1], i+1))
            }
            list.sort()
            val binary = Binary(Node(list[0])) //이진트리 루트
            for (i in 1 until list.size) {
                binary.insert(list[i]) //인지트리의 넣기
            }
            binary.preOrder(binary.root)
            binary.postOrder(binary.root)

            val answer = arrayOf(binary.preList.toIntArray(), binary.postList.toIntArray())

            return answer
        }
    }
    class Node(val point:Point) {
        var left:Node?=null
        var right:Node?=null
    }
    class Binary(val root:Node){
        val preList = ArrayList<Int>()
        val postList = ArrayList<Int>()

        fun insert(point:Point){
            find(root, point)
        }

        fun preOrder(node:Node) {
            preList.add(node.point.num)
            node.left?.let {
                preOrder(it)
            }
            node.right?.let {
                preOrder(it)
            }
        }

        fun postOrder(node:Node) {
            node.left?.let {
                postOrder(it)
            }
            node.right?.let {
                postOrder(it)
            }
            postList.add(node.point.num)
        }

        fun find(parent:Node, point:Point) { //네이밍을 find insert 등으로 수정
            if (point.x<parent.point.x) { // 부모의 좌표보다 왼쪽에 있으면
                if (parent.left==null) { //왼쪽 노드가 없을 경우
                    parent.left = Node(point) 
                } else { //왼쪽노드가 존재한다면 외쪽노드를 부모노드로 재 탐색
                    find(parent.left!!, point)
                }
            } else {
                if (parent.right==null) {// 부모의 좌표보다 오른쪽에 있고 오른 쪽 노드가 없을 경우
                    parent.right = Node(point)
                } else { //오른쪽노드가 존재한다면 외쪽노드를 부모노드로 재 탐색
                    find(parent.right!!, point)
                }
            }
        }
    }

    class Point(val x: Int, val y: Int, val num:Int) : Comparable<Point> { //좌표를 위쪽 부터 정리

        override fun compareTo(other: Point): Int {
            if (this.y > other.y) {
                return -1
            } else if (this.y == other.y) {
                if (this.x < other.x) {
                    return -1
                }
            }
            return 1
        }

}
반응형

'알고리즘' 카테고리의 다른 글

백준 1043 코틀린  (0) 2021.06.13
백준 1068 코틀린  (0) 2021.06.08
프로그래머스 가사검색 코틀린  (0) 2020.10.25
카카오 블라인드 2020 문자열 압축 코틀린  (0) 2020.09.06
백준 1806 부분합 코틀린  (0) 2020.07.05