
난이도: ★★★☆☆ • solved on: 2025-11-21

n을 각 자릿수 합으로 줄여 단일 자릿수(super digit)로 만든다. 이때 주어진 k만큼 n을 반복해 합산한 값으로 시작해야 한다.자료구조
String, String[]알고리즘/기법
핵심 키워드
- 문제 분해
- super digit은 “숫자를 자릿수 합으로 반복해서 단일 자릿수가 될 때까지 줄이는 작업”이다.
- 문제는
n을 문자열로 주기 때문에 정수 범위를 초과할 수 있다.n을k번 반복한 숫자를 직접 만드는 것은 비효율적이므로sum(n) * k로 간접 계산한다.
핵심 로직 흐름
if 길이가 1이면 → 그대로 반환 else → 문자 하나씩 더해 자릿수 합 생성 후 재귀 호출예외 처리
- k가 적용되는 시점은 첫 번째 계산에서만 고려한다.
- 초대형 숫자를 직접 생성하지 않는다.
public static int superDigit(String n, int k) {
// Write your code here
if(n.length() < 2){
if(k==0){
return Integer.parseInt(n);
}
int item = Integer.parseInt(n);
item *= k;
return superDigit(String.valueOf(item), 0);
}
String[] digits = n.split("");
int result = 0;
for(String s : digits){
result += Integer.valueOf(s);
}
return superDigit(String.valueOf(result), k);
}
핵심 차이:
n이 매우 길 경우에도 안전하도록long이나BigInteger대신 문자열 기반 합산 사용k는 첫 호출에서만 적용- 재귀 흐름이 더 직관적이고 조건이 단순함
- 코드량이 줄어 가독성이 높아짐
k가 1보다 크면 sum(n) * k 를 최초 한 번만 계산한다.public static int superDigit(String n, int k) {
// 첫 계산: n의 자릿수 합 × k
long initialSum = 0;
for (char c : n.toCharArray()) {
initialSum += (c - '0');
}
initialSum *= k;
return calcSuperDigit(initialSum);
}
private static int calcSuperDigit(long num) {
if (num < 10) {
return (int) num;
}
long sum = 0;
while (num > 0) {
sum += num % 10;
num /= 10;
}
return calcSuperDigit(sum);
}
sum(n) * k로 대체하는 것이 핵심이다.비슷한 유형 (GPT 추천)
확장 문제 (GPT 추천)