[백준] 4673. 셀프 넘버

bonnie·2022년 1월 4일
0

🟢 알고리즘 풀이

목록 보기
15/27
post-thumbnail

문제

https://www.acmicpc.net/problem/4673

풀이

우선 자리수를 각 나누어서 합을 구하는 함수 d를 먼저 구현해준다.
원래 숫자를 sum에 먼저 저장하고 자리수를 나누어서 각각 sum에 더해준다.
main 함수로 돌아와서 셀프넘버를 체크할 수 있는 boolean 배열을 만든 후 1~10000까지 생성자를 구한다. (d(i))
그리고 return 받은 sum(=number)가 10000보다 작은 숫자라면 해당 배열 index에 true를 저장한다.
배열을 다시 반복문으로 돌려서 각각의 값이 true가 아닌 경우 StringBuilder에 index를 append한 후, 반복문을 빠져나와서 StringBuilder를 출력한다.
간략하게 설명하면 하단의 표와 같다.

id(i)=numbercheck[number]
11+1+0=2check[2]=true
22+2+0=4check[4]=true
33+3+0=6check[6]=true

이렇게 check배열이 채워질 것이고, check[1], check[3], check[5]는 true 값이 없기 때문에(숫자의 합이 도출되지 않음) 셀프 넘버이다.
그래서 i값 즉, check배열의 index값을 출력해주면 된다.

코드

public class Q_4673_ver2 {
	public static void main(String[] args) {
		boolean[] check = new boolean[10001];
		
		for(int i = 1; i < check.length; i++) {
			int number = d(i);
			if(number < 10001) {
				check[number] = true;
			}
		}
		StringBuilder sb = new StringBuilder();
		for(int i = 1; i < check.length; i++) {
			if(! check[i]) {
				sb.append(i + "\n");
			}
		}
		System.out.println(sb);
	}
	static int d(int num) {
		int sum = num;
		while(num != 0) {
			// 첫째 자리수
			sum += (num % 10);
			// 나머지 자리수
			num = num / 10;
		}
		return sum;
	}
}
profile
괴발🐱개발🐶

0개의 댓글