본문 바로가기

TLI/코드카타

2024.06.05 TIL 코트카타 73번(공원 산책)

    fun solution(park: Array<String>, routes: Array<String>): IntArray {
        val directionX = intArrayOf(0,1,0,-1) // N,E,S,W
        val directionY = intArrayOf(-1,0,1,0)
        var currentX = -1
        var currentY = -1

        for(parkI in park.indices) {
            for(parkJ in park[parkI].indices) {
                if(park[parkI][parkJ] == 'S') {
                    currentX = parkJ
                    currentY = parkI
                    break;
                }
            }
            if(currentX >= 0)
                break;
        }

        for(route in routes) {
            val splitedRoute = route.split(" ")
            val direction = splitedRoute[0]
            val distance = splitedRoute[1].toInt()
            val directionIndex = when(direction) {
                "N" -> 0
                "E" -> 1
                "S" -> 2
                "W" -> 3
                else -> -1
            }

            if(validateMovement(currentX, currentY, distance, directionIndex, park)) {
                currentX += directionX[directionIndex] * distance
                currentY += directionY[directionIndex] * distance
            }
        }

        return intArrayOf(currentY, currentX)
    }

    fun validateMovement(currentX: Int
                         , currentY: Int
                         , distance: Int
                         , directionIndex: Int
                         , park: Array<String>): Boolean{

        val directionX = intArrayOf(0,1,0,-1)
        val directionY = intArrayOf(-1,0,1,0)

        // 최대 범위 체크
        val lastX = currentX + (directionX[directionIndex] * distance)
        val lastY = currentY + (directionY[directionIndex] * distance)
        if(lastX !in park[0].indices || lastY !in park.indices)
            return false
        
        // 이동 간 장애물 체크
        for(numMoved in 1..distance) {
            val movedX = currentX + (directionX[directionIndex] * numMoved)
            val movedY = currentY + (directionY[directionIndex] * numMoved)
            if(park[movedY][movedX] == 'X')
                return false
        }

        return true
    }

 

풀이 과정

1. park배열 탐색하면서 시작지점 확인

2. route의 타당성 검사(validateMovement)

   2,1. 이동하는 마지막 좌표가 범위를 벗어나는지 확인

   2.2. route에 따라 directionX / directionY로 방향을 정해 한칸씩 이동하면서 장애물이 있는지 확인

3. route가 타당하면 이동

4. 마지막 route까지 2~3과정 반복

 

포인트

- 방향에 따른 배열에 인덱스 접근을 다르게 하기 위해 directionX / directionY 배열 사용

   - 방향에 따라 when절을 통해  directionIndex이 결정되고  directionX / directionY의 인덱스에 사용