감자주먹밥

[백준] 2231 분해합 (swift) 본문

알고리즘/백준

[백준] 2231 분해합 (swift)

JustHm 2021. 12. 28. 00:34
728x90

문제

2231번: 분해합

 

2231번: 분해합

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

www.acmicpc.net

문제 해결

가장 작은 수부터 입력받은 수 전까지 하나씩 올라가며 분해합이 입력받은 값과 맞는지 확인하면 된다.

시간이 많이 들긴 하지만 범위가 크지 않아 성공할 수 있다.

각 자리수의 합은 나머지로 구할 수 있었지만, map과 reduce를 써보고 너무 재미있어서 적용해 봤다.

코드

var input = Int(readLine()!)!
var answer = 0
var sum = 0

for item in (input/2..<input) {
    sum = item
    sum += (String(item).map{Int(String($0))!}.reduce(0,+))
        
    if sum == input {
        answer = item
        break
    }
}

print(answer)

문제 해결 중 어려웠던 것

문제 해결 후 다른 사람들의 코드를 확인했는데, 시간이 엄청나게 차이가 났다...

처음에 생각할 땐 분해합은 일정 구간 이상부터 검사할 필요가 있겠다 싶었지만 그 위치를 알아내는 방법을 잘 모르겠어서 그냥 시간 복잡도가 높게 나오게 코딩하였다.

지금은 반 으로 줄인 코드긴 하지만 다른 사람들의 코드를 분석할 필요가 있을 것 같다.

다른 방식

let n = Int(readLine()!)!
var result = 0

for i in (n - String(n).count * 9)...n { // 여기서 어떤 이유에서 이렇게 줄였는지를 모르겠어요..
    var newN = i
    var sum = i
    while newN > 0 {
        sum += newN % 10
        newN /= 10
    }
    if sum == n {
        result = i
        break
    }
}

print(result)

https://barefoot-coder.tistory.com/27

 

BOJ 2231 분해합

문제출처 : https://www.acmicpc.net/problem/2231 1. 문제요약 - 어떤 자연수 M => 세 자릿수 라면 100a + 10b + c => M + a + b + c = N 즉, M과 각 자릿수의 합을 분해합, M을 생성자, N을 분해합 - 1 <= N..

barefoot-coder.tistory.com

 

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 7568 덩치 (swift)  (0) 2022.01.03
[백준] 2798 블랙잭 (swift)  (0) 2021.12.27
Comments