코딩테스트/기초

백준 4673 셀프 넘버 - python

math_tbro 2022. 1. 1. 19:31

 

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

 

4673번: 셀프 넘버

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

www.acmicpc.net

 

풀이 :

 

지금까지와는 좀 푸는 스타일이 많이 달라져서 좀 당황했다.

 

1. 일단 문제는 생성자 ex)33 => 3+3+33 = 39 => 3+9+39 = 51 이런식으로 계속 생성이 되는 숫자들이 아닌 selfnum 을 출력해야한다.

 

2. 일단 d(i) 함수를 임의로 만들어보자. 

일단 수 35를 받아온다고 해보자. def(35) 

그다음 다음 생성될 수 를 구하기 위해서 빈공간 a = 0을 지정해준다.

그 다음 35를 문자열 처럼 받아오는 것이 중요 해서 str(35) = '3','5' 처럼 출력 이 될거고 list(str(35)) => [3,5] 로 받아온다.

 

이걸 이제 for 문을 써서 3과 5를 가져온다. 

하지만 이 3과 5는 str 타입이므로 이걸 int(정수)로 바꿔야 숫자 계산이 가능하다.

 

따라서 a = a + int(x) 를 해줌으로 각 자리수 3+5 = 8 이 a에 저장이 된다. 다음 결과적으로 우리는 생성된 값을 출력해야한다.

그건 return a+n(원래숫자) 를 더함으로 43이 생성될것이다.

 

3. 이젠 출력을 해줘야한다.

일단 b = [] 빈공간을 만들어준다.

그 다음 생성자들을 1~10000 까지 구해줘야하므로 range(1,10001)(10001을 해야 10000까지) 설정해준다.

그 다음 k = d(i) 를 받아와서 b.append(k) 를 해주면 엄청난 생성자들의 리스트 b가 만들어질 것이다.

 

4. 이제 b는 공통된숫자도 많고 우리가 구하는건 생성자로 탄생하지 않은 숫자이므로 b에 나온 값을 없애주는 코드를 입력해야한다.

어렵게 생각하지 않고

for j in range(1,10001) :

     if j in b:  # j가 b에 들어있냐?

            pass :  #그럼 지나갈게 ㅎㅎ

    else :    # j가 b에 없어?

             print( j)  # 이게 셀프넘이다. 

 

이렇게 하면 답을 구할 수 있다.

 

무슨 set이용하고 차집합 이용하고 있는데 귀찮다..

 

 

'코딩테스트 > 기초' 카테고리의 다른 글

백준 11654 아스키코드  (0) 2022.01.02
백준 1065 한수 - Python  (0) 2022.01.01
백준 15596 정수 N개의 합  (0) 2022.01.01
백준 4344 평균은 넘겠지 - python  (0) 2022.01.01
백준 8958 OX퀴즈 - python  (0) 2022.01.01