티스토리 뷰
문제
https://www.acmicpc.net/problem/5014
풀이
이 문제에서 엘리베이터는 상하좌우로 움직이는 것이 아닌 위아래로만 움직인다. 따라서 이전에 dx, dy 대신 dy만 [u,-d]로 선언해주었다.
floor는 전체 층수보다 1더 크게 만든 뒤 -1로 채워주었다. 전체 층수보다 1크게 만든 이유는 floor[층수 - 1]이 아닌 [층수]로 이용하기 위해서다.
큐에 현재 있는 층을 넣은 뒤에 while문을 이용해 bfs를 돌려준다.
현재 층에서 u, -d를 더한 값을 각각 구해서 조건을 만족하는 경우에 이전의 값에 1을 더해주어 floor[newS]에 넣어준다.
현재 위치에서 u만큼 올라간 층이나 d만큼 내려간 층은 버튼을 한 번만 누른 것이기때문이다.
이렇게 반복해주다가 newS가 g와 같아졌을때엔 반복문을 탈출하고 값을 출력해준다.
만약 floor[g]가 반복문이 끝나고도 -1이면 방문하지 않았다는 것이므로 엘리베이터로 갈 수 없음을 의미한다.
이때는 "use the stairs"를 출력해준다.
import Foundation
let input = readLine()!.split(separator: " ").map { Int(String($0))! }
let f = input[0]
let s = input[1]
let g = input[2]
let u = input[3]
let d = input[4]
let dy = [u,-d]
var floor = Array(repeating: -1, count: f + 1)
var queue: [Int] = []
queue.append(s)
floor[s] = 0
while !queue.isEmpty {
let current = queue.removeFirst()
for i in 0..<dy.count {
let newS = current + dy[i]
if newS < 1 || newS > f {
continue
}
if floor[newS] == -1 {
queue.append(newS)
floor[newS] = floor[current] + 1
}
if newS == g {
break
}
}
}
floor[g] == -1 ? print("use the stairs") : print(floor[g])
_____________________________________________________________________________________________________
더 다양한 유형의 문제를 풀어봐야할듯
'PS' 카테고리의 다른 글
[Swift] 백준_상범 빌딩(6593) (0) | 2023.01.15 |
---|---|
[Swift] 백준_안전 영역(2468) (1) | 2023.01.15 |
[Swift] 백준_단지번호붙이기(2667) (0) | 2023.01.15 |
[Swift] 백준_영역 구하기(2583) (0) | 2023.01.15 |
[Swift] 백준_불(5427) (0) | 2023.01.14 |
댓글
최근에 올라온 글
- Total
- Today
- Yesterday