티스토리 뷰

 

이번 포스팅은 백준 알고리즘 사이트의 4673번 셀프 넘버 문제를 Python 언어로 코딩해보도록 하겠습니다. 아래 url로 접속하시면 문제를 볼 수 있습니다.

 

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

 

이번 포스팅은 새로운 단계인 함수 사용하기 단계의 첫 문제입니다.

 

 

이 문제의 경우 입력 없이 함수를 사용해 10000까지의 셀프 넘버를 모두 출력하는 문제입니다. 셀프 넘버란 생성자 없이 존재하는 수로 아래 그림을 보시면 이해하는데 도움이 될 것 같습니다.

 

 

숫자 2는 1을 통해 만들어지고, 숫자 4는 2를 통해 만들어지기에 셀프 넘버가 아닙니다. 그렇다면 10 이하의 수에서는 1, 3, 5, 7, 9가 대표적인 셀프 넘버가 될 것입니다. 이런식으로 10000까지의 모든 셀프 넘버를 출력하면 됩니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
def self_num():
    arr=list()
    res=0
    for i in range(110001):
        if i < 10:
            res = i+i
            arr.append(res)
        elif i < 100:
            res = i+(i//10)+(i%10)
            arr.append(res)
        elif i < 1000:
            res = i+(i//100)+((i%100)//10)+((i%100)%10)
            arr.append(res)
        elif i < 10000:
            res = i+(i//1000)+((i%1000)//100)+(((i%1000)%100)//10)+(((i%1000)%100)%10)
            if res <= 10000:
                arr.append(res)
    arr.sort()
    arr1 = [i for i in range(1,10001)]
    notSelf = [item for item in arr1 if item not in arr]
    for each in notSelf:
        print(each)
 
self_num()

 

이 문제는 함수 사용하기 단계의 문제기에 self_num()이라는 함수를 정의해줍니다. self_num() 함수는 arr라는 list와, 셀프 넘버인지를 구하기 위한 res 변수가 있습니다.

 

for문을 1부터 10000까지 반복하고 if/elif문을 이용해 각 자리수에 따라 조건을 설정해주었습니다. 자리수의 차이로 if문을 나누었기에 코드 동작 방식이 동일하여 11라인의 elif문을 대표적으로 보여드리도록 하겠습니다. 11라인은 1000이하의 i의 조건으로 3자리 수를 통한 셀프 넘버를 구하기 위한 코드입니다.

 

res에 i+(i//100)+((i%100)//10)+((i%100)%10) 값을 넣어주는데, 이는 i값에 i값 각 자리수를 더하는 코드입니다. 예를 들어 i가 365면 res에는 365+3+6+5로 379가 저장되게 되는 것입니다.

 

res 값을 구했으면 만들어놨던 arr에 res값을 차례로 추가합니다. 즉 arr에는 셀프넘버가 아닌 수가 저장을 하고, 18라인의 arr.sort() 함수를 통해 arr에 저장된 값을 오름차순으로 정렬해줍니다.

 

다른 코드 동작은 동일하지만 16라인은 예외 처리를 한 번 더 해주었습니다. 10000을 생성자로 셀프넘버까지 다 구하기에 res값이 10000이 넘지 않을 때까지만 arr에 res를 추가하여줍니다.

 

19라인과 20라인은 셀프 넘버인 수를 골라 내기 위한 코드로, 1부터 10000까지를 arr1에 넣어줍니다. 그리고 notSelf를 통해 arr1에 있는 수 중 arr에 있지 않은 수를 notSelf에 list형식으로 저장해줍니다. 이후 21라인을 통해 notSelf에 있는 모든 값을 출력하는 코드로 함수 작성을 마칠 수 있습니다.

 

24라인은 self_num() 함수를 호출하는 것으로 문제를 해결하는 코드를 작성해보았습니다.

 

 

다음 포스팅에서는 다음 문제를 풀어보도록 하겠습니다.

 

다음 포스팅에서 봐요 :))

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함