Developing Myself Everyday
article thumbnail
 

14503번: 로봇 청소기

첫째 줄에 방의 크기 $N$과 $M$이 입력된다. $(3 \le N, M \le 50)$  둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 $(r, c)$와 처음에 로봇 청소기가 바라보는 방향 $d$가 입력된다. $d$가 $0$인 경우 북쪽

www.acmicpc.net

 

1. 나의 풀이

이 문제는 문제에서 말하는대로만 따라가다 보면 쉽게 해결할 수 있는 간단한 시뮬레이션 문제이다. 리팩토링을 통해 더 좋은 코드를 만들 수 있겠지만 나는 직관적으로 문제를 해결하였다. 이 문제는 주석을 통해 문제를 설명하겠다.

<bash />
val dx = arrayOf(-1, 0, 1, 0) val dy = arrayOf(0, 1, 0, -1) lateinit var room : Array<IntArray> fun main() = with(System.`in`.bufferedReader()) { val (n, m) = readLine().split(" ").map { it.toInt() } val (r, c, d) = readLine().split(" ").map { it.toInt() } room = Array(n) { readLine().split(" ").map { it.toInt() }.toIntArray() } var tempX = r var tempY = c var way = d var cnt = 0 while (true) { // 지금칸에 청소를 해야하면 청소 if (room[tempX][tempY] == 0) { room[tempX][tempY] = -1 cnt++ } // 주위에 청소해야하는지 확인 var check = 0 for (i in 0 until 4) { val cleanX = tempX + dx[i] val cleanY = tempY + dy[i] if (cleanX in 0 until n && cleanY in 0 until m && room[cleanX][cleanY] == 0) { check++ } } // 현재 칸의 주변 중 청소되지 않는 빈 칸이 없는 경우 if (check == 0) { // 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다. var reverse = when(way) { 0 -> 2 1 -> 3 2 -> 0 else -> 1 } val reverseX = tempX + dx[reverse] val reverseY = tempY + dy[reverse] if(room[reverseX][reverseY] != 1) { tempX = reverseX tempY = reverseY } else break // 후진할 수 없다면 작동을 멈춘다. } // 현재 칸의 주변 중 청소되지 않는 빈 칸이 있는 경우 else { // 반시계 방향으로 90도 회전 way = when(way) { 0 -> 3 1 -> 0 2 -> 1 else -> 2 } // 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진 val turnX = tempX + dx[way] val turnY = tempY + dy[way] if (room[turnX][turnY] == 0) { tempX = turnX tempY = turnY } } } println(cnt) }

'백준 > 구현' 카테고리의 다른 글

15685: 드래곤 커브 - Kotlin  (0) 2023.05.23
14890번: 경사로 - Kotlin  (0) 2023.03.29
16235번: 나무 재테크 - Kotlin  (0) 2023.02.10
14499번: 주사위 굴리기 - Kotlin  (0) 2023.02.02
3190번: 뱀 - Kotlin  (0) 2023.01.31
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!