[λ°±μ€] (Swift) 1107λ² - 리λͺ¨μ»¨ (μμ νμ, λλ²μ§Έ μ€λ΅λ ΈνΈ)
π λ¬Έμ
https://www.acmicpc.net/problem/1107
1107λ²: 리λͺ¨μ»¨
첫째 μ€μ μλΉμ΄κ° μ΄λνλ €κ³ νλ μ±λ N (0 ≤ N ≤ 500,000)μ΄ μ£Όμ΄μ§λ€. λμ§Έ μ€μλ κ³ μ₯λ λ²νΌμ κ°μ M (0 ≤ M ≤ 10)μ΄ μ£Όμ΄μ§λ€. κ³ μ₯λ λ²νΌμ΄ μλ κ²½μ°μλ μ μ§Έ μ€μλ κ³ μ₯λ λ²νΌ
www.acmicpc.net
π λμ νμ΄
λ¨Όμ λ¬Έμ κ°,,, μΌλ¨ 골λλΌλ κ²μ λμ»₯ κ²μ΄ λ¬μ§λ§,, μμ μ νλ² νμ΄λ΄€λ λ¬Έμ μ΄κΈ°μ μ‘°κΈμ© κΈ°μ΅μ΄ λ¬λ€. μκ³ λ¦¬μ¦ λ¬Έμ νλ©΄μ μ΄κ±° λ°±νλ‘ λ€μμ κΈ°μ΅λͺ»ν¨ γ γ γ μ΄λ¬κ³ νμ§λ§, μκ·Όν κΈ°μ΅μ΄ λλ€!
μ°μ , μμ κ°μ κ²½μ°μλ μΈκ°μ§μ λ°©λ²μΌλ‘ μ±λμ μ΄λν μ μλ€.
1. +, - λ²νΌμΌλ‘λ§ μλ²½νκ² μ΄λ
2. μ«μλ²νΌμ΄ κ³ μ₯λμ§ μμμ, μ«μλ²νΌμΌλ‘λ§ μ΄λ
3. μ«μλ²νΌμ΄ κ³ μ₯λ κ²μ΄ μ겨μ κ°κΉμ΄ μ΄λλ‘ κ° μ΄λ ν΄μ +μ -λ‘ μΆκ°μ΄λ
μ΄λ κ² μΈκ°μ§ κ²½μ°λ‘ μκ°ν μ μλ€.
λ¬Έμ μ쑰건μ 보면, μ΄λνλ €κ³ νλ μ±λNμ 500000μ κ°κ±°λ μμμλ‘ μ μλμ§λ§, μ΄λν μ μλ μ±λμ 무νλλ€. μ¬κΈ°μ λ¨μνκ² 500000κΉμ§ λ²μλ₯Ό μ‘μΌλ©΄ λκ² μ§ νλ€κ° ν°μ½λ€μΉ μ¬λμ΄ λ°λ‘ λλ€!! π
μ±λμ΄ λ¬΄νλλ‘ μλ€κ³ μΈκΈν΄μ€ μ΄μ λ 무μμΌκΉ? μ΄λν μ μλ λ²μκ°, 쑰건μμ μ£Όμ΄μ§ 500000λ³΄λ€ λμ΄κ° μ λ μλ€λ λ»μ΄λ€.
μμλ‘ μ΄ν΄λ³΄μ.
μ±λ 500000μΌλ‘ μ΄λνλ€κ³ ν λ,
1μμ 500000μΌλ‘ μ΄λνλ κ²λ³΄λ€, 999000μμ 500000μΌλ‘ μ΄λνλ κ²μ΄ λ μ μ λ²νΌμ λλ₯΄κ³ μ΄λν μ μλ€.
μ΄λ¬ν κ²½μ°μ²λΌ, νμ¬ μλ³΄λ€ ν° μλ₯Ό λλ¬μ μ±λμ μ΄λνμλ λ ν¨μ¨μ μΌ μ μλ€. κ·Έλ¬λ―λ‘, λ²μλ₯Ό μ΅μ 1000000κΉμ§ λ΄μΌνλ€. (μ°λ¦¬κ° λ릴 μ μλ μ±λμ 50λ§ μ΄λ―λ‘!)
λ€μ κ·ΈλΌ λμμμ, μμμ μ μ 3κ°μ§ λ°©μμ forλ¬Έμ μ΄μ©ν΄μ μμ νμμΌλ‘ νμ΄λ³΄μ
π μ λ΅μ½λ
- solution() : λ©μΈν¨μ
- pressCloseNumber() : μ«μλ²νΌμ λλ₯΄λ νμλ₯Ό μΈμ΄μ£Όλ ν¨μ
- forλ¬Έμ λλ¦° μ΄μ : 0λ²λΆν° 1000000κΉμ§ μ λΆ λλ¬λ³΄λ κ². μ΄λν΄μΌνλ μκ° 100μ΄μ΄λ, 1000μ΄μ΄λ, 1000000μ΄μ΄λ λͺ¨λ μλ₯Ό νμν ν, κ°μ₯ μ΅μλ‘ λλ €μ§ λ²νΌ νμλ₯Ό μΆλ ₯ν μ μλλ‘ νλ€.
- μ²μ minCntμ +μ-λ‘λ§ μ΄λκ°λ₯ν νμλ₯Ό λ£μ΄μ€λ€. abs(μ΄λνλ €λμ±λn - μμμ±λ100)
- for λ¬Έμ μ΄μ©ν΄μ μ΅μκ°μ μ°Ύμμ€λ€.
- μ΅μκ°(+μ -λ§ λλ¬μ λλ Έμλ vs. μ±λ1λ‘ λλ¦¬κ³ +-λ‘ μ‘°μ ν νμ)
- μμμ λμΆλ μ΅μκ° vs. μ±λ2λ‘ λλ¦¬κ³ +-λ‘ μ‘°μ ν νμ
- μμμ λμΆλ μ΅μκ° vs. μ±λ3μΌλ‘ λλ¦¬κ³ +-λ‘ μ‘°μ ν νμ
- .....
- 100λ§κΉμ§ μ§ν
import Foundation
private func solution() {
let n = Int(readLine()!)!
let m = Int(readLine()!)!
var brokenBtn = [Int]()
if m != 0 {
brokenBtn = readLine()!.split(separator: " ").map { Int($0)! }
}
// +-λ‘λ§ μ΄λνλ νμ
var minCnt = abs(n - 100)
// μ«μλ²νΌμ λλ¬μ μ΄λνλ κ²½μ° μ λΆ ν
μ€νΈ
// μ«μλ²νΌμΌλ‘ iλ₯Ό λλ μ λλ, +-λ‘λ§ μ΄λν λλ λΉκ΅ν΄μ£Όλ λΆλΆ
for i in 0...1000000 {
let pressNumButton = pressCloseNumber(n: i, brokenBtn: brokenBtn)
if pressNumButton > 0 {
let pressNumAndPlusMinus = abs(n - i) // μ±λ iλ‘ μ΄λνμΌλκΉ, κ±°κΈ°μ +-λλ¬μ£Όλ νμ
minCnt = min(minCnt, pressNumAndPlusMinus + pressNumButton)
}
}
print(minCnt)
}
private func pressCloseNumber(n: Int, brokenBtn: [Int]) -> Int {
var n = n
if n == 0 {
if brokenBtn.contains(n) {
return 0
} else {
return 1
}
}
var buttonPressCnt = 0
while n > 0 {
if brokenBtn.contains(n % 10) {
return 0
}
n /= 10
buttonPressCnt += 1
}
return buttonPressCnt
}
solution()