반응형
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 |