티스토리 뷰

PS

[Swift] 백준_스타트링크(5014)

희철 2023. 1. 15. 19:52

문제

 

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

 

5014번: 스타트링크

첫째 줄에 F, S, G, U, D가 주어진다. (1 ≤ S, G ≤ F ≤ 1000000, 0 ≤ U, D ≤ 1000000) 건물은 1층부터 시작하고, 가장 높은 층은 F층이다.

www.acmicpc.net

 

 

풀이

 

이 문제에서 엘리베이터는 상하좌우로 움직이는 것이 아닌 위아래로만 움직인다. 따라서 이전에 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