
내가 생각했을때 문제에서 원하는부분
첫째 줄에 N이 주어진다.
N은 1,000,000,000보다 작거나 같은 자연수이다.
첫째 줄에 0이 총 몇 번 나오는지, 1이 총 몇 번 나오는지, ..., 9가 총 몇 번 나오는지를 공백으로 구분해 출력한다.
내가 이 문제를 보고 생각해본 부분
입력 받은 N을 Long 타입으로 저장한다.
N이 최대 10억이므로 int로도 가능하지만 안전하게 Long으로 선언해준다.
배열 counts는 0부터 9까지 각각 숫자가 몇 번 등장했는지를 저장한다.
digit 변수로 자리수를 나타낸다.
예를 들어 1은 일의 자리, 10은 십의 자리, 100은 백의 자리 등이다.
while 문 내에서:
한 자리씩 분해해서 숫자 등장 횟수를 세기 위해 high, curr, low를 계산한다.
high는 현재 자리 왼쪽 전체 숫자
curr는 현재 자리 숫자
low는 현재 자리 오른쪽 숫자
0부터 9까지 모든 숫자에 대해 등장 횟수를 계산해 counts 배열에 더한다.
단, 0은 앞자리(최상위 자리)에 올 수 없으므로 해당 자리수만큼 빼서 조정합니다.
digit을 10배씩 늘려가며 자리수를 옮겨가며 계산합니다.
반복문 종료 후 각 숫자의 등장 횟수를 출력합니다.
코드로 구현
package baekjoon.baekjoon_33;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
// 백준 1019번 문제
public class Main1315 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
long N = Long.parseLong(br.readLine());
int[] counts = new int[10];
long digit = 1; // 자리수 (1, 10, 100, ...)
while (N / digit != 0) {
long high = N / (digit * 10);
long curr = (N / digit) % 10;
long low = N % digit;
for (int i = 0; i < 10; i++) {
if (i < curr) {
counts[i] += (high + 1) * digit;
} else if (i == curr) {
counts[i] += high * digit + low + 1;
} else {
counts[i] += high * digit;
}
}
// leading zero 처리: 가장 높은 자리수에서는 0이 앞에 오지 않으므로 -digit 만큼 빼준다
counts[0] -= digit;
digit *= 10;
}
for (int i = 0; i < 10; i++) {
System.out.print(counts[i] + (i == 9 ? "\n" : " "));
}
br.close();
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.