Swift) 백준 3190번 뱀 - G4

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

 

3190번: 뱀

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

www.acmicpc.net

전형적인 구현 문제. 처음에는 head, tail 좌표값을 가지고서 2차원 배열에 표시하려고 했으나, 꼬리 부분을 지울때, 다름 꼬리를 지정하는 부분이 구현하기 까다로워서 디큐를 이용해 구현했다.

 

이동할 장소에 사과가 없다면 디큐의 맨 앞부분을 제거하고, 그 좌표값을 지도에 반영한다. 그 외에는 모두 이동할 장소의 좌표값을 넣어주는 식으로 구현했다.

import Foundation

let n = Int(readLine()!)!
let k = Int(readLine()!)!
var appleArr: [(Int, Int)] = []
var directionArr: [(Int, String)] = []
var map: [[Int]] = Array(repeating: Array(repeating: 0, count: n), count: n)
var currentDirection: Int = 0
let dx = [1,0, -1,0]
let dy = [0,1,0,-1]
var timer: Int = 0
var snakeHead: (Int, Int) = (0, 0)
var snakeArr: [(Int, Int)] = [(1,1)]

for _ in 0..<k {
    let apple = readLine()!.split(separator: " ").map { Int($0)! }
    map[apple[0]-1][apple[1]-1] = 1
    appleArr.append((apple[0]-1, apple[1]-1))
}
let l = Int(readLine()!)!
for _ in 0..<l {
    let direction = readLine()!.split(separator: " ").map { String($0) }
    directionArr.append((Int(direction[0])!, direction[1]))
}

while true {
    timer += 1
    
    let mY = snakeHead.0+dy[currentDirection]
    let mX = snakeHead.1+dx[currentDirection]
    
    if mY < 0 || mY >= n || mX < 0 || mX >= n {
        break
    }
    if map[mY][mX] == 2 {
        break
    }
    
    if map[mY][mX] != 1 {
        let lastCoordi = snakeArr.removeFirst()
        map[lastCoordi.0][lastCoordi.1] = 0
    } else {
        
    }
    map[mY][mX] = 2
    snakeHead = (mY, mX)
    snakeArr.append((mY, mX))
    if directionArr.contains(where: { $0.0 == timer }) {
        let order = directionArr.first { $0.0 == timer }!
        if order.1 == "D" {
            currentDirection = (currentDirection+1) % 4
        } else {
            currentDirection = (currentDirection-1) < 0 ? 3 : (currentDirection-1)
        }
    }
}

print(timer)