Potato
์•ˆ๋…•ํ•˜์„ธ์š”, ๊ฐ์žก๋‹ˆ๋‹ค?๐Ÿฅ” ^___^ ๐Ÿ˜บ github ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ‘‰๐Ÿป

Algorithm/Baekjoon

[๋ฐฑ์ค€] (Swift) 1107๋ฒˆ - ๋ฆฌ๋ชจ์ปจ (์™„์ „ํƒ์ƒ‰, ๋‘๋ฒˆ์งธ ์˜ค๋‹ต๋…ธํŠธ)

๊ฐ์ž ๐Ÿฅ” 2022. 12. 30. 14:56
๋ฐ˜์‘ํ˜•

๐ŸŸ  ๋ฌธ์ œ

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()
๋ฐ˜์‘ํ˜•