[코딩테스트] 🧹 로봇청소기 - 백준14503

2025. 10. 20. 20:59알고리즘

문제링크

난이도

골드 5

유형

구현

소요시간

1시간

회고

.......

코드

let NM = readLine()!.split(separator: " ").compactMap { Int($0) }
let (N, M) = (NM[0], NM[1])
let rcd = readLine()!.split(separator: " ").compactMap { Int($0) }
var (r, c, d) = (rcd[0], rcd[1], rcd[2])

let board = (0..<N).map { i in
    readLine()!.split(separator: " ").compactMap { Int($0) }
}
var visited = Array(repeating: Array(repeating: false, count: M), count: N)
var answer = 0

let dr = [-1, 0, 1, 0]
let dc = [0, 1, 0, -1]

while true {

    if !visited[r][c] {
        answer += 1
        visited[r][c] = true
    }
    var needClean = false

    for _ in 0..<4 {
        d = (d + 3) % 4
        let nr = r + dr[d]
        let nc = c + dc[d]

        if candidate(nr, nc), board[nr][nc] == 0, !visited[nr][nc] {
            r = nr
            c = nc
            needClean = true
            break
        }
    }

    // 2
    if needClean { continue }

    let br = r - dr[d]
    let bc = c - dc[d]
    if !candidate(br, bc) || board[br][bc] == 1 {
        break
    }

    r = br
    c = bc
}

print(answer)

func candidate(_ r: Int, _ c: Int) -> Bool {
    (0..<N) ~= r && (0..<M) ~= c
}