https://www.acmicpc.net/problem/14503
난이도 : 골드 5
태그 : 구현, 시뮬레이션
설명
단순 구현 + 시뮬레이션 문제이기에, 저는 큐나 DFS 없이 단순 구현으로 풀었습니다.
문제의 지문을 읽고 그대로 구현하면 되는데, 주의할 점이 몇 가지 있습니다.
로봇은 청소되지 않은 빈 칸이 있을 경우, 일단 반시계 방향으로 회전합니다.
현재 바라보고 있는 방향부터 탐색(X)
일단 왼쪽으로 한 번 틀고 4방향 탐색(O)
소스코드
import java.util.StringTokenizer
fun main() = with(System.`in`.bufferedReader()) {
// 북동남서 순
val dx = arrayOf(-1, 0, 1, 0)
val dy = arrayOf(0, 1, 0, -1)
val (n, m) = readLine().split(" ").map { it.toInt() }
var (robotX, robotY, robotD) = readLine().split(" ").map { it.toInt() }
// 0123 : 북동남서 순
val map = Array(n) {
val st = StringTokenizer(readLine())
Array(m) { st.nextToken().toInt() }
}
var cnt = 0
turn@ while (true) {
// 현재 칸이 청소되어 있지 않음 -> 청소
if (map[robotX][robotY] == 0) {
map[robotX][robotY] = -1
cnt++
} else if (map[robotX][robotY] == 1) {
break@turn
}
for (i in 0 until 4) {
if (--robotD == -1) robotD = 3
val nx = robotX + dx[robotD]
val ny = robotY + dy[robotD]
// 청소하지 않은 곳을 발견하면 이동
if (map[nx][ny] == 0) {
robotX = nx
robotY = ny
continue@turn
}
}
// 4 방향 모두 다 이미 청소했다면? -> 후진
robotX -= dx[robotD]
robotY -= dy[robotD]
}
println(cnt)
}
dx, dy를 사용하였는데요.
입력이 0 - 북, 1-동, 2-남, 3-서 순서대로 주어지기 때문에,
0(북 | 1(동) | 2(남) | 3(서) | |
dx | -1 | 0 | 1 | 0 |
dy | 0 | 1 | 0 | -1 |
위와 같은 순서로 dx, dy의 원소를 만들었습니다.
또한, 반시계 방향으로 90도 씩 회전하기 때문에, 방향(robotD)를 1씩 감소시키면서 반시계 90도 회전을 나타낼 수 있습니다.
후기
푼 사람이 은근 많다 싶었는데, 알고보니 삼성 기출문제네요.
이런 문제만 나오면 얼마나 좋을지...ㅎㅎ
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 6749번] [Kotlin] Next in line (0) | 2023.05.23 |
---|---|
[백준 7287번] [Kotlin] 등록 (0) | 2023.05.21 |
[백준 16235번] [Kotlin] 나무 재테크 (0) | 2023.05.13 |
[백준 10844번] [Kotlin] 쉬운 계단 수 (0) | 2023.05.12 |
[백준 13418번] [Kotlin] 학교 탐방하기 (0) | 2023.05.11 |