티스토리 뷰

PS

[Swift] 백준_뱀(3190)

희철 2023. 1. 10. 17:32

문제

 

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

 

3190번: 뱀

 'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임

www.acmicpc.net

 

 

풀이

 

케이스도 많지 않아 구현만 하면 되는 문제였다.

 

뱀의 길이를 큐의 크기로 생각하였다. 이동한 위치를 current라는 변수로 나타내고, 이 current가 사과를 먹었다면 큐에 current를 추가하고 꼬리를 지우지않는 방향으로 구현하였다.

 

방향은 0,1,2,3을 각각 오른쪽, 위, 아래, 왼쪽으로 생각하여 방향에 따라 current의 값을 계산해주었다.

import Foundation

let n = Int(readLine()!)!
let k = Int(readLine()!)!
var apples: [[Int]] = []
var changeD: [[String]] = []
var current = [1,1]
var left: [[Int]] = [current]
var right: [[Int]] = []
var size = 1
var direction = 0 // 0오른쪽 1위 2아래 3왼쪽
var time = 0
for _ in 0..<k {
    apples.append(readLine()!.split(separator: " ").map { Int(String($0))! })
}
let l = Int(readLine()!)!
for _ in 0..<l {
    changeD.append(readLine()!.split(separator: " ").map { String($0) })
}
while true {
    time += 1
    switch direction {
        case 0:
            current[1] += 1
        case 1:
            current[0] -= 1
        case 2:
            current[0] += 1
        default:
            current[1] -= 1
    }
    //벽과 만나는지 확인
    if current[0] == n + 1 || current[1] == n + 1 || current[0] == 0 || current[1] == 0 {
        break
    }
    //자신의 몸과 만나는지 확인
    if (left + right).contains(current) {
        break
    }
    left.append(current)
    //사과가 있는지 확인 -> 꼬리 안지워도됨
    if !apples.contains(current) {
    //큐가 가득찼으면 꼬리 지우기
        if left.count + right.count > size {
            if right.isEmpty {
                right = left.reversed()
                left.removeAll()
            }
            right.removeLast()
        }
    } else {
        apples.remove(at:apples.firstIndex(of: current)!)
        size += 1
    }

    if !changeD.isEmpty {
        if time == Int(changeD[0][0])! {
            if changeD[0][1] == "D" {
                switch direction {
                    case 0:
                        direction = 2
                    case 1:
                        direction = 0
                    case 2:
                        direction = 3
                    default:
                        direction = 1
                }
                changeD.removeFirst()
            } else {
                switch direction {
                    case 0:
                        direction = 1
                    case 1:
                        direction = 3
                    case 2:
                        direction = 0
                    default:
                        direction = 2
                }
                changeD.removeFirst()
            }
        }
    }
}
print(time)

 

_____________________________________________________________________________________________________

'PS' 카테고리의 다른 글

[Swift] 백준_미로탐색(2178)  (0) 2023.01.11
[Swift] 백준_그림(1926)  (0) 2023.01.10
[Swift] 백준_좋은 친구(3078)  (0) 2023.01.10
[Swift] 백준_AC(5430)  (0) 2023.01.09
[Swift] 백준_덱(10866)  (0) 2023.01.08
댓글
최근에 올라온 글
Total
Today
Yesterday