본문 바로가기
Algorithm

[구현/수학] 백준 4673 셀프 넘버 - Python, Java

by jangThang 2022. 1. 28.
반응형

백준 온라인 저지

 

[ Contents ]

     

     

    1. 문제 (링크 참조)

     

    4673번: 셀프 넘버

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

    www.acmicpc.net

     

     

     

    2. 문제 풀이

     10000이하의 셀프 넘버를 출력하는 문제입니다. 셀프 넘버의 규칙은 다음과 같습니다.

    생성자 d(n): 자기 자신(n)과 각 자리수를 더한 수
    Self Number: 생성자가 없는 수

     

     

    2022.01.19 - [Algorithm] - [Algorithm] 단골 1번 문제, 구현 / 수학

     

    [Algorithm] 단골 1번 문제, 구현 / 수학

    1. 구현  단순히 '구현'만 하면 되는 문제 유형입니다. 문제를 이해하고 입력에 맞춰 적절한 출력만 하면 됩니다. 특별한 알고리즘이나 프로그래밍적 기법 없이, 단순 제어문만 사용하여 해결할

    star7sss.tistory.com

     1부터 10000까지 생성자를 구하여, 셀프 넘버가 아닌 것을 소거해나가는 문제입니다. 소수를 구하는 에네토스 테네스의 체와 비슷한 방식입니다. 

     

     

     

    3. 코드

    def selfNumber(n):
        res = n
        #각 자릿수 더하기
        while n != 0:
            res += n%10
            n //= 10
        return res

     먼저, selfNumber를 구하는 함수를 정의합니다. 위 공식대로, 자기 자신과 각 자리수를 더합니다.

     

     

    number = [0]*10001
    for i in range(10001):
        # 생성자 계산
        d = selfNumber(i)
        if d < 10001:
            number[d] += 1
            
        # 셀프넘버 출력
        if number[i] == 0:
            print(i)

     0~10000까지의 리스트를 0으로 초기화합니다. 셀프넘버인지 아닌지를 판별하는 체크리스트로 사용됩니다.

     0부터 10000까지 반복문을 돌면서, 계산된 생성자와 같은 숫자는 셀프넘버에서 제외합니다. 자기 차례가 될 때까지, 셀프넘버에서 제외되지 않은 수는 '셀프넘버'입니다.

     


     

    public class Main {
    	public static void main(String[] args) {
    		final int MAX_NUM = 10001;
    		int[] selfNumberFlag = new int[MAX_NUM];
    		
    		for(int num=1; num<MAX_NUM; num++) {
    			int notSelfNumber = notSelfNumber(num);
    			
    			if(notSelfNumber < MAX_NUM) {
    				selfNumberFlag[notSelfNumber] = 1;
    			}
    		}
    		
    		for(int i=1; i<MAX_NUM; i++) {
    			if(selfNumberFlag[i] == 0) {
    				System.out.println(i);
    			}
    		}
    
    	}
    	
    	public static int notSelfNumber(int num) {
    		int result = num;
    	
    		while(num > 0) {
    			result += num % 10;
    			num /= 10;
    		}
    		
    		return result;
    	}
    }

     

    반응형

    댓글