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)
'Algorithm > 백준' 카테고리의 다른 글
Swift) 백준 17503번 맥주 축제 - S1 (0) | 2023.07.09 |
---|---|
Swift) 백준 2116번 주사위 쌓기 - G5 (0) | 2023.06.14 |
Swift) 백준 5430번 AC - G5 (1) | 2023.06.07 |
Swift) 백준 2468번 안전영역 - S1 (1) | 2023.06.06 |
Swift) 백준 14500번 테트로미노 - G4 (0) | 2023.06.05 |