
난이도: ★☆☆☆☆ • solved on: 2025-12-23

N에 대해, N = i + (i의 각 자리수 합)을 만족하는 가장 작은 생성자 i를 찾아 출력해야 한다. 없으면 0을 출력한다.자료구조
알고리즘/기법
N - 9 * (자릿수)부터 검사핵심 키워드
- 문제 분해
어떤 수
i의 분해합은i + (자리수 합)이다.자리수 합의 최댓값은 (자릿수
L일 때)9L이므로,
i가 생성자라면i >= N - 9L범위 안에 있어야 한다.따라서
N - 9L부터N-1까지 후보만 검사하면 된다.
핵심 로직 흐름
start = N - 9 * len(N) for i from start to N-1: total = i + sumDigits(i) if total == N: print i 종료 print 0예외 처리
- 생성자가 없는 경우 →
0출력- 시작점이 음수가 될 수 있음(예: N이 매우 작을 때)
- 현재 코드도 동작은 하며(음수 후보는 어차피 불일치), 일반적으로는
max(1, start)로 보정하기도 함.
import java.util.*;
import java.lang.*;
import java.io.*;
class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String candidate;
long total = 0;
long n = Long.parseLong(s);
int digit;
for (long i = n - 9*s.length(); i < n; i++) {
candidate = String.valueOf(i);
for(int j = 0; j < candidate.length(); j++) {
digit = candidate.charAt(candidate.length() - j - 1) - '0';
total += digit;
}
total += i;
if(total == n){
System.out.println(i);
return;
}
total = 0;
}
System.out.println(0);
}
}
시간 복잡도: O(L * 9L) ≈ O(L^2)
9L개, 각 후보마다 자리수 합 계산이 O(L)공간 복잡도: O(L)
String.valueOf(i)로 문자열 후보를 만들기 때문에 후보 문자열 길이만큼 추가 사용char → int 변환을 할 때, candidate.charAt(...) - '0' 형태로 ASCII 코드 차이를 이용해 숫자로 바꾸는 부분이 낯설었다.숫자 문자('0'~'9')를 정수로 바꿀 때는 보통 아래 패턴을 쓴다.
digit = c - '0';비슷한 유형 (GPT 추천) :
확장 문제 (GPT 추천) :