https://www.acmicpc.net/problem/3190
전형적인 구현 문제. 처음에는 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 |