알고리즘

백준 - 함수

joy_lee 2021. 7. 27. 11:29

set 자료형(집합 자료형)

  • 중복을 허용하지 않는다.
  • 순서가 없다.

첫 번째 특징을 이용해서 중복을 제거하는데 사용했다.

 

예시 1.

백준 1065번 문제 / 한수 찾기 - https://www.acmicpc.net/problem/1065

 

1065번: 한수

어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나

www.acmicpc.net

각 자리가 등차수열인지 구하려면 각 자리수들의 차이를 구하고, 그 차이가 모두 동일한지 확인해야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def arithmetic(n):
    # 10 이하의 수는 한수이다
    if 0 < n < 10return True
    # 각 자리수를 따로 number라는 list에 저장
    number = list(map(intstr(n)))
    diff_list = []
    # 각 자리수의 차 구함
    for i in range(1len(number)):
        dif = number[i]- number[i-1]
        diff_list.append(dif)
    diff_set = set(diff_list)
    # 등차수열인지 확인
    if len(diff_set) == 1:
        return True
    else:
        return False
 
cs

수가 한수인지 구하는 함수를 만들었다.

각 자리수들의 차를 구해 diff_list에 저장한 후, set으로 변환해주었다.

set으로 변환하면 자연스럽게 중복값이 제거되는데, 등차수열이라면 한 가지 값만 남게된다.

변환된 diff_set의 길이를 확인해 1이면 한수로 확인해 True를 반환하고, 그 이외의 경우에는 False를 반환한다.

1
2
3
4
5
6
7
= int(input())
count = 0
# 한수의 개수 세기
for i in range(N + 1):
    if arithmetic(i) == True:
        count += 1
print(count)
cs

N을 입력받아 한수를 찾을 범위를 정한다.

range(N)은 0부터 N-1까지의 수를 반환하므로 range(N+1)으로 코드를 작성했고, 위에 만든 함수에 값을 하나씩 집어넣어서 True를 반환하면 count의 개수를 하나 늘려주었다.

 


예시 2.

4673번 문제 / 셀프 넘버 - 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
2
3
4
5
6
7
def generate(n):
    ans = 0
    ans += n
    while n > 0:
        ans += n % 10
        n = n // 10
    return ans
cs

generate 함수는 n을 입력받아 n과 n의 각 자리수를 더하는 값을 반환하는 함수이다.

자리수를 더해주기 위해서 while문을 사용했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def self_number():
    # True로 리스트 초기화
    init_num = [True for i in range(10001)]
    # 생성자로 만들어진 수인 경우 False로 바꿔줌
    for i in range(10001):
        num = generate(i)
        if num < 10001:
            init_num[num] = False
    # True값을 가진 인덱스만 출력
    for i in range(10001):
        if init_num[i] == True:
            print(i)
 
self_number()
cs

self_number라는 함수를 만들었다.

10000보다 작거나 같은(10000 포함되어야함) 셀프 넘버를 찾아야 하기 때문에 range(10001)을 사용했다.

모두 True인 list에서 생성자로 만들어진 수인 num번째 요소의 값을 False로 바꿔준다.

그러면 generate()함수에 의해 만들어지지 않은 수만 True를 유지하게 된다.

True값을 가진 인덱스의 수만 출력해준다.

 

참고한 페이지

set 자료형 - https://wikidocs.net/1015

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

'알고리즘' 카테고리의 다른 글

백준 - 2908번 / python slicing  (0) 2021.08.02
백준 - 10809번 / 아스키코드, enumerate()  (0) 2021.07.28
백준 - 1차원 배열  (0) 2021.07.26
백준 - while문  (0) 2021.07.20
백준 - for문  (0) 2021.07.20