문제풀이

[JAVA] 백준 4673번 셀프넘버 : 아리토스테네스의 체

IT록흐 2021. 7. 10. 15:57
반응형

 

 

4673번: 셀프 넘버

셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다. 양의 정수 n이 주어졌을 때,

www.acmicpc.net

 

1. 문제 추상화

 

1 ~ 10000 중 셀프 넘버인 수를 출력하시오.

 

2. 알고리즘 

 

- 아리토스테네스의 체

boolean 배열을 만들어 셀프넘버인 수와 아닌 수를 True와 False로 구분

 

 

에라토스테네스의 체 - 위키백과, 우리 모두의 백과사전

수학에서 에라토스테네스의 체는 소수를 찾는 방법이다. 고대 그리스 수학자 에라토스테네스가 발견하였다. 알고리즘[편집] 2부터 소수를 구하고자 하는 구간의 모든 수를 나열한다. 그림에서

ko.wikipedia.org

 

 

1) 나의 풀이

package boj4673;

public class Main {
	// 에라토스테네스의 체
	// 나의 풀이
	public static void main(String[] args) {
		
		boolean[] decimalArray = new boolean[10050];
		//합이 10000이 넘어가는 제약상황을 자료구조에 투영했다.
		//제약위반이 발생하면 조건문으로 처리하고 자료구조는 문제에 주어진 조건을 그대로 따른다.
		
		for(int i=1; i<=10000;i++) {
			int j = d(i);
			decimalArray[j] = true;
		}
		for(int j=1; j<=10000;j++){
			if(decimalArray[j]==false) {
				System.out.println(j);
			}
		}
	}
	
	public static int d(int data) {
		int result = data;
		
		while(data > 0) {
			int value = data%10;
			data /= 10;
			result += value;
		}
		return result;
	}
}

 

2) 일반적인 풀이

public class Main {
		// 다른 사람 풀이
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 자료구조는 제약이 적용된 상태가 아닌 조건으로 주어진 그대로로 만든다.
		// 제약은 조건 및 반복으로 구현한다.
		int size = 10001;
		boolean[] isNotSelfNumber = new boolean[size];
		
		for(int i=1; i<isNotSelfNumber.length;i++) {
			int result = d(i);
			if(result < size) {
				isNotSelfNumber[result]= true;
			}
		}
		
		for(int i=1; i < isNotSelfNumber.length; i++) {
			if(isNotSelfNumber[i]==false) {
				System.out.println(i);
			}
		}
	}
	
	public static int d(int data) {
		int result = data;
		while(data > 0) {
			result += data%10;
			data /= 10;
		}
		return result;
	}

}

 

 

개선해야 될 점

 

배열이나 리스트는 조건에 주어진대로 만든다. 

제약조건은 if나 for문으로 구현한다. 

자료구조에 제약조건을 반영하지 말자.

반응형