Where who wants to meet someone

백준 Swift [2231] 분해합 본문

백준 알고리즘 문제 기록/브루트 포스

백준 Swift [2231] 분해합

Lust3r 2023. 7. 4. 23:36
728x90

난이도

브론즈 II

 

문제

https://www.acmicpc.net/problem/2231

 

2231번: 분해합

어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이

www.acmicpc.net

 

내 답안

let n = Int(readLine()!)!
// 입력받은 n의 자리수를 얻기 위한 프로퍼티
let divideN = String(n).map { $0 }

var sumArr: [Int] = []

// 전체를 다 도는 것이 아니라 각 자리수에 올 수 있는 최대값인 9를 빼준 값부터 n까지만 반복문 처리
for i in max(1, (n - 9 * divideN.count))...n {
    let devideI = String(i).map { Int(String($0))! }

    // i와 각 자리수를 더한 값을 더했을 때 n이 된다면 sumArr에 append
    if i + devideI.reduce(0, +) == n {
        sumArr.append(i)
    }
}

// sumArr의 최소값을 찾는데, 없다면 0을 출력하고 있다면 그 최소값을 출력
sumArr.min() != nil ? print(sumArr.min()!) : print(0)

- 처음에는 For문에서 조건을 for i in (n - 9 * divideN.count)...n {} 으로 했었다. 그러나 계속 런타임 오류가 발생해서 map에서의 문제인가 했었는데 착하고 능력있는 친구의 도움으로 해결할 수 있었다.(Thanks to A)

문제가 되는 것은 (n - 9 * divideN.count)인데, 각 자리수의 최대치를 더한 값을 빼주는 것이라서 당연히 n + 각 자리수의 합은 이거보다 크지 않을까? 했던 것이다. 여기서 n이 각 자리수의 합보다 작다면 음수가 되기 때문에 for문을 돌 수 없는 것이다.(가령 10은 11 - 18 = -7, 13은 17 - 18 = -1)각 자리수의 합을 빼줬을 때 음수가 아니고 1보다 크다면 상관 없지만 아니라면 1부터 전체를 돌게 해주는 방식으로 오류를 해결하였다.