TIL/kotlin 알고리즘

kotlin 프로그래머스 lv1 공원 산책

crablo 2024. 2. 23. 15:26
728x90

문제에서 park의 배열이 

이런식으로 나타나져있어서 직접 공책에 그림을 그려서 생각해 보았다.

얼추 문제의 그림과 유사한것 같았다.

문제에서 

이런 제약사항이 있는데

나는 이 제한 사항을 park를 행과 열을 가진 직사각형으로 보고

만약 공원을 벗어나는지의 유무는

park의 행이나 열을 벗어날때로 생각했고,

장애물은 park의 요소중 'X'를 의미하므로

위 2가지중 하나만 만나게되더라도 명령을 중단하고

그다음 명령을 수행하면 되었다.

 

그래서 가장 먼저 S(시작점)을 찾고 명령을 수행하도록 코드를 아래와 같이 작성했다.

 

class Solution {
    fun solution(park: Array<String>, routes: Array<String>): IntArray {
        val answer = IntArray(2)

        // 'S' 위치 찾기
        var currentRow = park.indexOfFirst { it.contains('S') }
        var currentCol = park[currentRow].indexOf('S')
        println("Initial Position: ($currentRow, $currentCol)")

        if (currentRow == -1) return answer

        // 각 명령 수행하기
        for (route in routes) {
            val direction = route[0]
            val steps = route.substring(2).toInt()

            println("Processing Route: $direction $steps")

            var moveSuccessful = true
            var initialRow = currentRow
            var initialCol = currentCol

            repeat(steps) {
                when (direction) {
                    'E' -> {
                        if (currentCol + 1 < park[0].length && park[currentRow][currentCol + 1] != 'X') {
                            currentCol++
                        } else {
                            println("동쪽으로 가지 못감 다음 명령수행해야함")
                            moveSuccessful = false
                            return@repeat
                        }
                    }
                    'S' -> {
                        if (currentRow + 1 < park.size && park[currentRow + 1][currentCol] != 'X') {
                            currentRow++
                        } else {
                            println("남쪽으로 가지 못감 다음 명령수행해야함")
                            moveSuccessful = false
                            return@repeat
                        }
                    }
                    'W' -> {
                        if (currentCol - 1 >= 0 && park[currentRow][currentCol - 1] != 'X') {
                            currentCol--
                        } else {
                            println("서쪽으로 가지 못감 다음 명령수행해야함")
                            moveSuccessful = false
                            return@repeat
                        }
                    }
                    'N' -> {
                        if (currentRow - 1 >= 0 && park[currentRow - 1][currentCol] != 'X') {
                            currentRow--
                        } else {
                            println("북쪽으로 가지 못감 다음 명령수행해야함")
                            moveSuccessful = false
                            return@repeat
                        }
                    }
                }

                println("Current Position: ($currentRow, $currentCol)")
            }

            if (!moveSuccessful) {
                currentRow = initialRow
                currentCol = initialCol
            }
        }

        answer[0] = currentRow
        answer[1] = currentCol

        println("Final Position: ($currentRow, $currentCol)")

        return answer
    }
}

 

위와 같이 작성했고 

예외처리 부분에서

 

 moveSuccessful = false
                            return@repeat

이렇게 작성함으로써

다음 명령을 수행할 수 있도록 

 if (!moveSuccessful) {
                currentRow = initialRow
                currentCol = initialCol
            }

 

돌아가게끔 설계했다.

실행결과는 다행히도 잘나왔고

예외 처리하는데 return@repeat만 해서 계속 테스트케이스3번째에서 오류가 났는데

함수를 하나만들고 다시 돌아가는 위치를 지정해줘서 에러없이 잘 해결되었다.

728x90