728x90
728x90
π€ λ¬Έμ μ ν :: λΈλ£¨νΈν¬μ€(μμ νμ) / λ°±νΈλνΉ
π‘ νμ΄ λ°©λ²
βοΈ κ°μνλ μκ° μ΄λ»κ² ꡬμ±λλμ§ λ¨Όμ μκ°ν΄λ³Έλ€.
π n μ리μ μ«μλΌλ©΄ 첫째 μλ¦¬κ° κ³ μ λμ΄μμ λ, λλ²μ§Έλ 첫째 μλ¦¬λ³΄λ€ μμ κ°μΌλ‘, μΈλ²μ§Έλ λλ²μ§Έ μλ¦¬λ³΄λ€ μμ κ°μΌλ‘, nλ²μ§Έ μ리λ n-1 λ²μ§Έ μλ¦¬λ³΄λ€ μμ κ°μΌλ‘ ꡬμ±λλ€.
βοΈ λ¬Έμ λ₯Ό νλ©΄μ μ°Έκ³ ν΄μΌ νλ μ¬νλ€
- κ°μνλ μμ μ΅λκ°μ 9876543210μΌλ‘, μ΅λ μ리μλ 10μ리μ΄λ€.
- κ°μνλ μμ μ΅μκ°μ 0μΌλ‘, μ΅μ μ리μλ 1μ΄λ€.
- κ°μνλ μμ κ°μλ 1022κ°μ΄λ€. N = 1023 λΆν°λ -1μ μΆλ ₯ν΄μΌ νλ€.
βοΈ νμ΄λ₯Ό μ 리νμλ©΄ ?!
- μ리 μλ₯Ό μ§μ νκ³ , μ리μμ λ°λΌ κ°μνλ μλ₯Ό μ°Ύλλ€. --- 0 λΆν° 9κΉμ§ λ°λ³΅νλ€. (νΉμ 1 ~ 10)
- 0λ²μ§Έ μ리μ 0 ~ 9 κΉμ§μ μ«μλ₯Ό κ³ μ μν€κ³ , DFS λ₯Ό ν΅ν΄ 1..<n λ²μ§Έ μ리μ κ°μ μ°Ύλλ€.
- DFS μμλ νμ¬κΉμ§ μ±μμ§ μ리μ κ°λ³΄λ€ μμ κ°λ€λ‘ λ€μ κ°μ λμ μν¨λ€.
- DFS μ’ λ£λ μ±μμ§ μ리μκ° μ§μ λ μ리μλ³΄λ€ ν¬κ±°λ κ°μ κ²½μ° μ’ λ£λλ©°, μ΄ λ κ°μνλ μ λ°°μ΄μ κ°μ μΆκ°νλ€.
π Swift νμ΄
struct BOJ_1038 {
var decreasingNumbers: [Int] = []
/// j λ²μ§Έ μ리μ κ°μ μ±μκ°λ©° number λ°°μ΄μ μμ±νλ ν¨μ, i λ²μ§Έ μ리κΉμ§ λ€ μ°¨λ©΄ decreasingNumbers μ μΆκ°νλ€.
mutating func dfs(_ i: Int, _ j: Int, number: [Int]) {
// i λ μ«μμ μ리μ, j λ νμ¬κΉμ§ μ±μμ§ μ리μ
if j >= i {
let intNumber = number.reduce(0, {$0*10 + $1})
decreasingNumbers.append(intNumber)
return
}
for k in (0..<number[j]).reversed() {
var newNumber = number
newNumber[j+1] = k
dfs(i, j+1, number: newNumber)
}
}
/// N λ²μ§Έ κ°μνλ μλ₯Ό μ°Ύλ ν¨μ
mutating func findDecreasingNumbers(_ N: Int) {
// i λ μ«μμ μ리μ, num μ 0λ²μ¬ μ«μλ‘ μ§μ ν κ°
for i in 0...9 {
for num in 0...9 {
var number = Array(repeating: 0, count: i+1)
number[0] = num
dfs(i, 0, number: number)
}
}
decreasingNumbers.sort()
if N >= decreasingNumbers.count {
print(-1)
} else {
print(decreasingNumbers[N])
}
}
mutating func run() {
let N = Int(readLine()!)!
findDecreasingNumbers(N)
}
}
var boj = BOJ_1038()
boj.run()
βοΈ μ°Έκ³ ν λ¬Έλ²
μ μν λ°°μ΄ [Int] λ₯Ό λ°°μΉλ μμλλ‘ μ μν μ«μ Int λ‘ λ°κΎΈλ λ°©λ²
let intNumber = number.reduce(0, {$0*10 + $1})
728x90
728x90