λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
🐍 Algorithm/μ•Œκ³ λ¦¬μ¦˜-Swift

[μ•Œκ³ λ¦¬μ¦˜/Swift] BOJ 1038 κ°μ†Œν•˜λŠ” 수 - μ™„μ „ 탐색

by Danna 2021. 6. 9.
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})
 

Concatenate Swift Array of Int to create a new Int

How can you make an Array ([1,2,3,4]) into a regular Int (1234)? I can get it to go the other way (splitting up an Int into individual digits), but I can't figure out how to combine the ...

stackoverflow.com

 

728x90
728x90