728x90
문제
문제 해결
가장 작은 수부터 입력받은 수 전까지 하나씩 올라가며 분해합이 입력받은 값과 맞는지 확인하면 된다.
시간이 많이 들긴 하지만 범위가 크지 않아 성공할 수 있다.
각 자리수의 합은 나머지로 구할 수 있었지만, 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
728x90