14503번: 로봇 청소기백준/문제2023. 11. 1. 17:19
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/14503
언어 : Kotlin
문제 설명 :
로봇 청소기와 방의 상태가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오.
로봇 청소기가 있는 방은
크기의 직사각형으로 나타낼 수 있으며, 1×1 크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북 중 하나이다. 방의 각 칸은 좌표 로 나타낼 수 있고, 가장 북쪽 줄의 가장 서쪽 칸의 좌표가 (0,0) , 가장 남쪽 줄의 가장 동쪽 칸의 좌표가 이다. 즉, 좌표 는 북쪽에서 번째에 있는 줄의 서쪽에서 ( 번째 칸을 가리킨다. 처음에 빈 칸은 전부 청소되지 않은 상태이다.로봇 청소기는 다음과 같이 작동한다.
- 현재 칸이 아직 청소되지 않은 경우, 현재 칸을 청소한다.
- 현재 칸의 주변
-
- 바라보는 방향을 유지한 채로 한 칸 후진할 수 있다면 한 칸 후진하고 1번으로 돌아간다.
- 바라보는 방향의 뒤쪽 칸이 벽이라 후진할 수 없다면 작동을 멈춘다.
칸 중 청소되지 않은 빈 칸이 없는 경우, -
- 현재 칸의 주변
- 반시계 방향으로 90∘ 회전한다.
- 바라보는 방향을 기준으로 앞쪽 칸이 청소되지 않은 빈 칸인 경우 한 칸 전진한다.
- 1번으로 돌아간다.
칸 중 청소되지 않은 빈 칸이 있는 경우,
- 첫째 줄에 방의 크기 과 이 입력된다. (3 ≤ N, M ≤ 50) 둘째 줄에 처음에 로봇 청소기가 있는 칸의 좌표 와 처음에 로봇 청소기가 바라보는 방향 가 입력된다. 가 0인 경우 북쪽, 인 경우 동쪽, 인 경우 남쪽, 인 경우 서쪽을 바라보고 있는 것이다.첫째 줄에 N(2 ≤ N ≤ 50)과 M(1 ≤ M ≤ 13)이 주어진다.
- 셋째 줄부터 N개의 줄에 각 장소의 상태를 나타내는 N × M개의 값이 한 줄에 개씩 입력된다. 번째 줄의 번째 값은 칸 의 상태를 나타내며, 이 값이 0인 경우 가 청소되지 않은 빈 칸이고, 1인 경우 에 벽이 있는 것이다. 방의 가장 북쪽, 가장 남쪽, 가장 서쪽, 가장 동쪽 줄 중 하나 이상에 위치한 모든 칸에는 벽이 있다. 로봇 청소기가 있는 칸은 항상 빈 칸이다.
- 로봇 청소기가 작동을 시작한 후 작동을 멈출 때까지 청소하는 칸의 개수를 출력한다
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 512MB
입출력 예 :
입력 | 출력 |
3 3 1 1 0 1 1 1 1 0 1 1 1 1 |
1 |
11 10 7 4 0 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 1 1 0 0 1 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 |
57 |
풀이 :
후진할때 뒤에 벽이 있든 없든 후진부터 시킨 뒤, 반복문의 처음으로 돌아가 해당 위치가 벽이라면 종료시켜서 답을 얻는 방식
import java.io.BufferedWriter
import java.io.OutputStreamWriter
import java.util.*
var answer = 0
val dx = arrayOf(-1, 0, 1, 0)
val dy = arrayOf(0, 1, 0, -1)
fun main() = with(System.`in`.bufferedReader()) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
val (n, m) = readLine().split(" ").map { it.toInt() }
var (r, c, d) = readLine().split(" ").map { it.toInt() }
val map = Array(n) {
val st = StringTokenizer(readLine())
IntArray(m) { st.nextToken().toInt() }
}
pattern@ while (true) {
if (map[r][c] == 0) {
map[r][c] = 2
answer++
} else if (map[r][c] == 1) {
break@pattern
}
for (i in 0 until 4) {
if (--d == -1) d = 3
val nx = r + dx[d]
val ny = c + dy[d]
if (map[nx][ny] == 0) {
r = nx
c = ny
continue@pattern
}
}
r -= dx[d]
c -= dy[d]
}
bw.write("$answer")
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
2754번: 학점계산 (0) | 2023.11.02 |
---|---|
10797번: 10부제 (0) | 2023.11.02 |
15686번: 치킨 배달 (0) | 2023.10.31 |
14502번: 연구소 (0) | 2023.10.30 |
1202번: 보석 도둑 (1) | 2023.10.20 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!