Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

난이도 : 골드 5
태그 : 구현, 시뮬레이션

 

 

1. 설명

단순 구현 + 시뮬레이션 문제이기에, 저는 큐나 DFS 없이 단순 구현으로 풀었습니다.

문제의 지문을 읽고 그대로 구현하면 되는데, 주의할 점이 몇 가지 있습니다.

 

 

로봇은 청소되지 않은 빈 칸이 있을 경우, 일단 반시계 방향으로 회전합니다.

현재 바라보고 있는 방향부터 탐색(X)

일단 왼쪽으로 한 번 틀고 4방향 탐색(O)

 

 

 

2. 소스코드

<kotlin />
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도 회전을 나타낼 수 있습니다.

 

 

 

 

3. 후기

푼 사람이 은근 많다 싶었는데, 알고보니 삼성 기출문제네요.

이런 문제만 나오면 얼마나 좋을지...ㅎㅎ

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.