ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ

2022. 10. 22. 12:01ใ†ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-Swift

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค - ๋‹ค๋ฆฌ๋ฅผ ์ง€๋‚˜๋Š” ํŠธ๋Ÿญ

 

 

 ๋ฌธ์ œ ์„ค๋ช…

 

https://school.programmers.co.kr/learn/courses/30/lessons/42583

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

 

 ๋‚˜์˜ ํ’€์ด

 

(ํŠธ๋Ÿญ์˜๋ฌด๊ฒŒ, ์‹œ๊ฐ„์ดˆ) ํŠœํ”Œ์„ ์ด์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค.

ํ๋ฅผ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์— ์‹œ๊ฐ„์„ ๋งŽ์ด ์จ์„œ ๊ตฌํ˜„๋ฐฉ์‹์œผ๋กœ ํ’€์ด๋ฅผ ํ•œ ๊ฒƒ ๊ฐ™๋‹ค.

๋งˆ์ง€๋ง‰ cnt์— bridge_length๋ฅผ ๋”ํ•˜๋Š” ์ด์œ ๋Š” ๋งˆ์ง€๋ง‰ ํŠธ๋Ÿญ์„ ์ง€๋‚˜์„œ break๊ฐ€ ๋œ ์ƒํƒœ์—์„œ ๋งˆ์ง€๋ง‰ ํŠธ๋Ÿญ์ด ๋‹ค ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ bridge_length๋งŒํผ์ด๊ธฐ ๋–„๋ฌธ์ด๋‹ค.

 

 

import Foundation

func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    var q: [(Int, Int)] = []
    var idx = 0
    var sum = 0
    var cnt = 0 
    while true {
        // ์ธ๋ฑ์Šค๊ฐ€ ํŠธ๋Ÿญ์˜ ๊ฐœ์ˆ˜๋ณด๋‹ค ์ปค์ง€๋ฉด
        if idx == truck_weights.count {
            break
        }
        // ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๊ณ  ๋“ค์–ด์˜จ ์‹œ๊ฐ„์ด ๋‹ค๋ฆฌ๊ธธ์ด๊ฐ€ ๋œ๋‹ค๋ฉด ์ œ๊ฑฐ
        if let first = q.first, first.1 == bridge_length {
                sum -= first.0
                q.removeFirst()    
        }
        // ํ˜„์žฌ ํ์— ๋ฌด๊ฒŒ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์„๋•Œ ํ•œ๊ณ„๋ฌด๊ฒŒ๋ณด๋‹ค ์ž‘๋‹ค๋ฉด ์ถ”๊ฐ€
        if sum + truck_weights[idx] <= weight {
            sum += truck_weights[idx]
            q.append((truck_weights[idx], 0))
            idx += 1
        } 
        // ํ ๊ฐ๊ฐ ํŠธ๋Ÿญ์— ์‹œ๊ฐ„์ดˆ๋ฅผ ๋”ํ•ด์ฃผ๊ธฐ.
        q = q.map{ ($0.0, $0.1+1) }
        cnt += 1
    }
    cnt += bridge_length
    
    return cnt
}

 

 

 

 ๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

 

๋‹ค๋ฆฌ์˜ ๊ฐœ์ˆ˜๋งŒํผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•ด์ค€ ๋’ค ํŠธ๋Ÿญ์— ๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด appendํ•˜๊ณ  ๋ฌด๊ฒŒ์ œํ•œ๋•Œ๋ฌธ์— ๋“ค์–ด์˜ฌ ์ˆ˜ ์—†๋‹ค๋ฉด 0์„ ๋„ฃ์–ด์คŒ์œผ๋กœ์จ ๋‹ค๋ฆฌ์˜ ์ƒํƒœ๋ฅผ ์ถ”์ƒํ™”์‹œ์ผœ์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฆ‰ ์ฒซ ๋ฒˆ์งธ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋ฅผ ๋ณด๋ฉด [7, 4, 5, 6]์˜ ๋ฐฐ์—ด์—์„œ ๋‹ค๋ฆฌ์˜๊ธธ์ด๊ฐ€ 2๊ธฐ๋•Œ๋ฌธ์— ์ด๋ ‡๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

[0, 0] -> [0, 7] -> [7, 0] -> [0, 4] -> [4, 5] -> [5, 0] -> [0, 6] -> [6] -> []

 

์ด ๋ฌธ์ œ์˜ ์ˆจ๊ฒจ์ง„ ํ•ต์‹ฌ์€ trucks์— ํŠธ๋Ÿญ์ด ์žˆ๋Š”๋ฐ ๋ฌด๊ฒŒ๋•Œ๋ฌธ์— ๋ชป์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ์šฐ์—๋งŒ 0์„ appendํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰ trucks์— ํŠธ๋Ÿญ์ด ์—†๋‹ค๋ฉด 0์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋ฐฐ์—ด์ด Empty์ƒํƒœ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.

 

์–ด๋–ป๊ฒŒ ์ด๋Ÿฐ ์ƒ๊ฐ์„ ํ–ˆ์„๊นŒ ์‹ ๊ธฐํ•˜๋‹ค.. ์ง์ ‘ ํŠœํ”Œ๋กœ ์‹œ๊ฐ„์ดˆ๋ฅผ ๋‹ด์€ ๋‚˜์™€ ๋‹ฌ๋ฆฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋œ ๋ฐฐ์—ด์„ ์ด์šฉํ•ด์„œ ๊ฑด๋„ˆ๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•œ ๊ฒŒ ์ธ์ƒ๊นŠ์—ˆ๋‹ค.

 

import Foundation

func solution(_ bridge_length:Int, _ weight:Int, _ truck_weights:[Int]) -> Int {
    var bridge = Array(repeating: 0, count: bridge_length)
    var trucks = truck_weights
    var bridgeWeight = 0
    var time = 0
    // ๋‹ค๋ฆฌ๊ฐ€ ๋น„์–ด์žˆ์„๋•Œ๊นŒ์ง€ ์ง„ํ–‰
    while !bridge.isEmpty {
        time += 1
        // ๋งจ ์•ž์—์žˆ๋Š” ํŠธ๋Ÿญ์„ ์ง€์›Œ์•ผ ๋‹ค๋ฆฌ์˜ ๋ฌด๊ฒŒ
        bridgeWeight -= bridge.removeFirst()
        
        if let t = trucks.first {
            if t + bridgeWeight <= weight {
                bridgeWeight += trucks.removeFirst()
                bridge.append(t)
            } else { //trucks์— ํŠธ๋Ÿญ์ด ์žˆ๋Š”๋ฐ ๋ฌด๊ฒŒ๋–„๋ฌธ์— ๋ชป์˜ฌ๋ผ๊ฐ€๋Š” ๊ฒฝ์šฐ์— 0์„ ์ถ”๊ฐ€.
                bridge.append(0)
            }
        }
        
    }
    return time
}