๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ 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