μλ νμΈμ μ μΈμ λλ€:)
PSλ‘ ν루λ₯Ό νμ°¨κ² μμνλ €κ³ νλλ° μ΄μ ν μΌμ μ’ νκ³ λ¬Έμ λ₯Ό νμ΄μΌκ² μ΄μ...γ <-<
μ€λ μ λ₯Ό κ΄΄λ‘ν λ¬Έμ λ₯Ό 보μμ£ μ§κ²λ€λ¦¬ 건λκΈ° λ μκ³ .
λ¬Έμ λ§ν¬
λ¬Έμ νμ΄
μ²μ νμ΄
ν¬ ν¬μΈν° νμ© (ν μ€νΈμΌμ΄μ€ λͺ¨λ ν΅κ³Ό, but ν¨μ¨μ± 0μ )
import Foundation
func solution(_ stones:[Int], _ k:Int) -> Int {
var pointer1 = 0, pointer2 = k-1
var max = Int.max // κΈΈμ΄ kμΈ κ΅¬κ°μμμ μ΅λκ° μ μ₯
while pointer2 < stones.count {
let maxElement = stones[pointer1...pointer2].max()!
if max > maxElement { max = maxElement }
pointer1 += 1
pointer2 += 1
}
return max
}
μ²μμλ ν¬ ν¬μΈν°λ₯Ό νμ©ν΄ μ¬λΌμ΄λ© μλμ° κΈ°λ²μΌλ‘ kκ°μ λλ€λμ ν ꡬκ°μΌλ‘ μ€μ ν΄μ μ 체λ₯Ό μ€μΊνλ λ°©μμΌλ‘ νμμ΅λλ€.
μλνλ©΄, μ§κ²λ€λ¦¬λ₯Ό λ μ΄μ 건λμ§ λͺ»νκ² λλ μκ°μ μ ν μ«μκ° 0μ΄ λλ λλ€λμ΄ kκ° μ°λ¬μ λμ€λ κ²½μ°μ΄κΈ° λλ¬Έμ κΈΈμ΄κ° kμΈ κ΅¬κ° μμμμ μ΅λκ°μ΄ ν΄λΉ ꡬκ°μ 건λ μ μλ μ¬λμ μ΅λ μ«μλΌλ κ²μ νμ νκ³ , νμ κ°μ₯ κ°κΉμ΄ λμ λ°μμΌ νλ―λ‘ ν μ¬λμ΄ κ±΄λ λλ§λ€ μ 체 λμ μ«μκ° 1μ© κ°μνκΈ° λλ¬Έμ μ 체 λ€λ¦¬λ₯Ό 건λ μ μλ μ¬λμ μ΅λ μ«μλ₯Ό ꡬνκΈ° μν΄μλ ν κ΅¬κ° λ΄μ μ΅λκ°μ μ μ₯νλ©΄μ λ μμ μ΅λκ°μ΄ λμ€λ©΄ κ°±μ ν΄μ£Όλ λ°©λ²(μ΅λκ°λ€ μ€ μ΅μκ°μ΄ μ΅μ’ λ΅)μΌλ‘ μ΅μ’ κ°μ ꡬν μ μκ² λ€κ³ μκ°νμ΅λλ€.
μ΄λ¬ν μμ΄λμ΄λ λ§μλ κ² κ°μλ°, μ 체 λ€λ¦¬λ₯Ό μ€μΊνλ κ³Όμ μμ κ΅¬κ° λ΄μ μ΅λκ°μ μ°ΎκΈ° μν΄ λ§€λ² μ 체 λ°°μ΄μ kλ§νΌ μ¬λΌμ΄μ€ν΄μ κΈΈμ΄κ° kμΈ μλ‘μ΄ λ°°μ΄μ μμ±νκ² λκΈ° λλ¬Έμ μκ° λ³΅μ‘λκ° O(k)κ° λμ΄ μ 체 λ°°μ΄μ κΈΈμ΄κ° κΈΈλ€λ©΄ λΉν¨μ¨μ μΈ νμ λ°©μμ΄ λ©λλ€. (μ΄ λ¬Έμ μ κ²½μ° stones λ°°μ΄μ ν¬κΈ°κ° μ΅λ 200,000μ λλ€.)
ν¨μ¨μ±μ μ΄λ»κ² κ°μ ν κΉ.. νλ€κ° μ΄μ μ λ°°μ΄μ μμλ₯Ό κ³μ μΆκ°ν΄μ£Όλ©΄μ μ΅λκ° or μ΅μκ°μ μ λ°μ΄νΈ ν΄μ£Όμ΄μΌ ν λ μ°μ μμ νλ₯Ό νμ©ν κΈ°μ΅μ΄ μμ΄μ νμ ꡬνν΄μ κ°μ ν΄λ³΄μ! λΌλ μμ΄λμ΄κ° λ μ¬λμ§λ§, μ°μ μμ νμ ν¬κΈ°λ₯Ό κ³μ kλ‘ μ μ§νκΈ° μν΄μλ μ 체 λ°°μ΄μ μννλ©° μλ‘μ΄ κ°μ insertν΄μ€ λ λ°°μ΄μ λ°λ‘ μ΄μ μΈλ±μ€μ μμλ₯Ό μ°μ μμ νμμ μμ ν΄μ£Όμ΄μΌ νλλ°, μ°μ μμ νμμλ νΉμ μμλ₯Ό μ°Ύμμ remove μ°μ°μ ν΄μ€ μκ° μκΈ° λλ¬Έμ (μ°μ μμ νμ μμλ insert, removeν΄μ€ λλ§λ€ μμκ° λ°λκΈ° λλ¬Έμ removeFirst()λ‘λ μ΄μ μ½μ κ° μμ λΆκ°) μ΄ λ°©λ²μΌλ‘λ κ°μ ν μ μκ² κ΅¬λ..λ₯Ό κΉ¨λ«κ³ λ€λ₯Έ νμ΄λ₯Ό μ°Ύμ보μμ΅λλ€..
μ΅μ’ νμ΄
λ€λ₯Έ λΈλ‘κ·Έλ€μ νμ΄λ₯Ό μ°Έκ³ ν κ²°κ³Ό, μ΄λΆ νμ μκ³ λ¦¬μ¦μ μ¬μ©ν΄μ λ¬Έμ λ₯Ό ν΄κ²°ν μ μμμ΅λλ€. (μ΄λΆ νμμ μκ°μ§λ λͺ»νμ΄μ)
건λ μ μλ μ¬λμ μλ₯Ό λ°μΌλ‘ μ€μ¬κ°λ©΄μ νμΈνλ λ°©μμΌλ‘ μ΅μ μ ν΄λ₯Ό μ°Ύμλ΄λ λ°©μμ΄μλλ°μ, μ΄λΆ νμμ μ΄μ©ν νμ΄ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
1. leftμ rightλ₯Ό κ°κ° stones λ°°μ΄μ μμκ° λ μ μλ μ΅μκ°κ³Ό μ΅λκ°μΌλ‘ μ΄κΈ°νν©λλ€. (left = 1, right = 200000000)
2. midλͺ μ μ¬λμ΄ μ§κ²λ€λ¦¬λ₯Ό 건λ μ μλμ§ νμΈν΄λ΄ λλ€.
3-1. 2μ κ³Όμ μμ 건λ μ μμΌλ©΄ midλͺ μ΄μμ λ²μλ₯Ό νμνλ©΄ λλ―λ‘ left κ°μ mid+1λ‘ λ°κΏλλ€.
3-2. 2μ κ³Όμ μμ 건λ μ μλ€λ©΄ right κ°μ midλͺ μ΄νμ λ²μλ₯Ό νμνλ©΄ λλ―λ‘ midλ‘ λ°κΏλλ€.
4. 건λ μ μλ μ΅λ λͺ μλ₯Ό ꡬν΄μΌ νλ―λ‘, left < right μΈ λμ μμ κ³Όμ μ λ°λ³΅ν©λλ€.
Swift νμ΄ μ½λ
import Foundation
func solution(_ stones:[Int], _ k:Int) -> Int {
var left = 1
var right = 200000000
while left < right {
let mid = (left + right) / 2
var skipCount = 0 // 건λλ°μ΄μΌνλ λμ κ°μ
for i in 0..<stones.count {
if stones[i] - mid <= 0 { // μ μ 0 μ΄νλ‘ λ¨μ΄μ§λ κ³³ μκΈ°λ©΄
skipCount += 1
if skipCount >= k { // μ μ 0λλ κ³³μ΄ μ°λ¬μ kκ° μ΄μ λμ€λ©΄
break // λ°λ³΅λ¬Έ νμΆ
}
} else { // midλͺ
λ§νΌ 건λ μ μμΌλ©΄
skipCount = 0 // skipCount μ΄κΈ°ν
}
}
// κ°λ₯ μ¬λΆμ λ°λΌ left, right λ€μ μ€μ
if skipCount >= k { // midλͺ
건λ μ μμΌλ©΄ midλͺ
μ΄νμ λ²μλ₯Ό νμ
right = mid
} else { // midλͺ
건λμ μμΌλ©΄ midλͺ
μ΄μμ λ²μλ₯Ό νμ
left = mid + 1
}
}
return left
}
[μ°Έκ³ μλ£]
'π₯ CS > Algorithm' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[Algorithm/Swift] νλ‘κ·Έλλ¨Έμ€(Lv.3) - μ κ΅μ¬μ¬ (2) | 2023.04.05 |
---|---|
[Algorithm/Swift] νλ‘κ·Έλλ¨Έμ€(Lv.2) - κ°μ₯ ν° μ μ¬κ°ν μ°ΎκΈ° (2) | 2023.04.03 |
[Algorithm/Swift] νλ‘κ·Έλλ¨Έμ€(Lv.3) - κΈ°μ§κ΅ μ€μΉ (2) | 2023.03.30 |
[Algorithm/Swift] μ΄μ§ νμ(Binary Search) (0) | 2023.02.06 |
[Algorithm/Swift] νλ‘κ·Έλλ¨Έμ€(Lv.2) - 무μΈλ μ¬ν (1) | 2023.01.29 |