알고리즘 문제풀이/백준

#4673 : 셀프 넘버

모항 2022. 4. 16. 00:56

풀이방법

사용된 것:

함수형 프로그래밍

 

20022.04.16

모든 요소의 값이 0으로 초기화된, 길이가 10001인 int형 1차원 배열 arr을 만든다.

 

1부터 10000까지의 모든 정수에 대하여

문제에서 말한 d(n)을 수행할 것이다.

이 때,

어떤 정수 n에 대하여 수행한 d(n)의 결과값을 num이라 할 때

arr[num]에 저장된 값을 1 증가시킨다.

 

그럼 d(n)의 결과값으로 한 번도 도출된 적이 없는 수들은

arr에서 해당 인덱스에 저장된 값이 0으로 남아있게 된다.

따라서 arr[1]부터 arr[10000]까지 중 0이 저장되어있는 요소가 발견되면 요소의 인덱스 값을 화면에 출력하면 된다.

 

d(n)을 함수로 구현하여

반복문을 통해 1부터 10000까지의 n에 대하여 d(n)을 수행해야 하므로

함수형 프로그래밍을 사용해야 하는 문제이다.

 

코드

Java(2022.04.16)

import java.util.Arrays;

public class Main {
	
	static int[] arr;
	
	static void d(int n) {
		//1000의 자리, 100의 자리, 10의 자리, 1의 자리의 수
		int a = 0;
		int b = 0;
		int c = 0;
		int d = 0;
		
		a = n/1000;
		b = (n%1000)/100;
		c = (n%100)/10;
		d = n%10;
		
		int num = n + a + b + c + d;
		if(num<10001) {
			arr[num]++;
			f(num);	//재귀
		} else return;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		arr = new int[10001];	//초기값은 0
		//1부터 10000까지의 수에 대하여 f를 재귀수행
		for(int i = 1; i<10001; i++) {
			d(i);
		}
		
		StringBuilder sb = new StringBuilder();
		for(int i = 1; i<10001; i++) {
			//arr[i]의 값이 0이면 i가 셀프 넘버이므로 i를 출력
			if(arr[i] == 0) sb.append(i + System.lineSeparator());
		}
		System.out.print(sb);
	}

}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

#2609 : 최대공약수와 최소공배수  (0) 2022.04.17
#2930 : 가위 바위 보  (0) 2022.04.16
#1966 : 프린터 큐  (0) 2022.04.13
#11650 : 좌표 정렬하기  (0) 2022.04.13
#10866 : 덱  (0) 2022.04.13