뚱땅뚱땅

[문제] 백준 4673번 셀프넘버 본문

알고리즘/백준

[문제] 백준 4673번 셀프넘버

양순이 2021. 1. 19. 17:37
728x90

* 단계별로 풀어보기 : 함수

public class Main {
	public static void main(String[] args) {
		boolean check[] = new boolean[10000];
		
		int self = 0;
		
		for(int d=0;d<10;d++) {
			for(int c=0;c<10;c++) {
				for(int b=0;b<10;b++) {
					for(int a=0;a<10;a++) {
						self = f(d,b,c,a);
						if(self>=10000) continue;
						check[self] = true;
					}
				}
			}
		}
		for(int i=0;i<10000;i++) {
			if(!check[i])
				System.out.println(i);
		}
	}
	static int f(int d, int c, int b, int a) {
		return 1001*d + 101*c + 11*b + 2*a;
	}
}

 

첨에 이게 뭔말이냐 했지만! 손으로 써가면서 이해해서 단순한 공식을 만든 줄 알았으나.... 이렇게 푸는건 너무 시간이 오래걸리는 문제가 있다........ 너무 주먹구구식으로 푼 것 같다.

 

아래 코드가 정답이다.

while문 내의 코드를 이해해야한다. 나는 자리수를 모르는데 어떻게 코딩하지? 라는 생각으로 공식을 세워보고 저렇게 for문에 다 때려넣은건데....

while문은 num의 일의 자리수마다 더하고, num을 10으로 나누면 하나씩 자리수가 땡겨진다는 걸 표현한다. 

 

public static int d(int num) {
		int sum = num;
		while(num !=0) {
			sum += (num%10);
			num /=10;
		}
		return sum;
	}
	public static void main(String[] args) {
		boolean[] check = new boolean[10001];
		for(int i=0;i<10001;i++) {
			int n =d(i);
			if(n<=10000)
				check[n] = true;
		}
		
		StringBuilder sb = new StringBuilder();
		
		for(int i=0;i<10001;i++) {
			if(!check[i])
				sb.append(i).append("\n");
		}
		System.out.println(sb);
	}

그리고 StringBuiler랑 StringBuffer 사용에 익숙해지자!

728x90
Comments