import java.util.*
class Solution {
fun solution(rows: Int, columns: Int, queries: Array<IntArray>): IntArray {
var answer = intArrayOf()
var arr = MutableList( rows ){ r->
MutableList( columns ){ c ->
r* columns + c +1
}
}
val deQueue = ArrayDeque<Int>()
queries.forEach{ qr ->
var tracker = Tracker(qr)
var starter = arr[tracker.r][tracker.c]
for( i in 1 .. tracker.repeatCount){
deQueue.add(arr[tracker.r][tracker.c])
tracker.nextPosition()
}
var min = 100*100
tracker.nextPosition()
while(deQueue.isNotEmpty()){
arr[tracker.r][tracker.c] = deQueue.first()
if(min > deQueue.first()){
min = deQueue.first()
}
deQueue.removeFirst()
tracker.nextPosition()
}
answer += min
}
return answer
}
}
class Tracker(arr : IntArray){
var r = arr[0] -1
var c = arr[1] -1
var r1 = arr[0] -1
var r2 = arr[2] -1
var c1 = arr[1] -1
var c2 = arr[3] -1
var direction = Direction.UP
var repeatCount = (r2-r1+1) * (c2-c1+1) - (r2-r1-1) * (c2-c1-1)
fun nextDirection(){
val isEdge = ((r == r1 && (c==c1 || c ==c2)) ||
(r == r2 && (c ==c1 || c==c2 )))
if(isEdge){
when(direction){
Direction.RIGHT ->{
direction = Direction.DOWN
}
Direction.DOWN->{
direction = Direction.LEFT
}
Direction.LEFT->{
direction = Direction.UP
}
Direction.UP->{
direction = Direction.RIGHT
}
}
}
}
fun nextPosition(){
nextDirection()
when(direction){
Direction.RIGHT ->{
c+=1
}
Direction.DOWN ->{
r+=1
}
Direction.LEFT ->{
c-=1
}
Direction.UP ->{
r-=1
}
}
}
}
enum class Direction{
RIGHT,
DOWN,
LEFT,
UP ;
}
여러번 풀어본 결과 다른 문제에 적용한다고 생각해보면 이렇게 연습해야겠음..
'코딩테스트(코틀린) 기초부터 연습' 카테고리의 다른 글
20240411(프로그래머스 n+1카드, 파이썬) (0) | 2024.04.12 |
---|---|
프로그래머스 오픈채팅방 (0) | 2021.04.21 |
프로그래머스 예상 대진표 (0) | 2021.04.21 |
프로그래머스 최소공배수.. (0) | 2021.04.21 |
프로그래머스 피보나치 (0) | 2021.04.20 |