본문 바로가기

programming/algorithm

[algorithm] 백준 단계별 문제 풀이 (함수)

[algorithm] 백준 단계별 문제 풀이 (함수)

 

안녕하세요. 심심한 코딩쟁이입니다.

 

오늘은 백준 단계별 문제 중 함수를 사용하는 문제들의 풀이를 살펴보려합니다.

 

파이썬3 를 사용해 문제 풀이를 진행하겠습니다.

 

문제마다 링크를 걸어두었으니 문제를 살펴보시고 문제를 푼 다음에 저와

 

풀이를 비교해 보시는 걸 추천드립니다.


차근차근 풀어봅시다.

 

algorithm
알고리즘


백준 BAEKJOON 15596

 

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

 

 

15596번: 정수 N개의 합

C++17, Java 8, Python 3, C11, PyPy3, C99, C++98, C++11, C++14, Go, C99 (Clang), C++98 (Clang), C++11 (Clang), C++14 (Clang), C11 (Clang), C++17 (Clang)

www.acmicpc.net

 

문제 해석

 

n개의 정수가 있는 리스트를 받아서 합을 리턴하는 함수를 작성하는 문제

 

풀이

 

def solve(a):
    total = sum(a)
    return total

 

풀이 해석 및 팁

 

문제에서 a라는 리스트가 주어진다고 명시되어있기 때문에 함수의 매개변수로 a를 사용해줘야합니다.

백준 BAEKJOON 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

 

문제 해석

 

양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다. 
n을 d(n)의 생성자라고 한다. 예를 들어, 101은 생성자가 2개(91과 100) 있다. 
생성자가 없는 숫자를 셀프 넘버라고 할 때 10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 문제

 

풀이

 

def d(n):
    result = n + sum(list(map(int, str(n))))   
    return result

l = list(range(1, 10000+1))

for i in range(1, 10000+1):
    try:
        l.remove(d(i))
    except:
        continue  

for self_num in l:
    print(self_num)

 

풀이 해석 및 팁

 

# 함수 d의 내용 중 아래 코드 설명 ###
result = n + sum(list(map(int, str(n))))
###############################
함수 d의 내용을 보면 숫자 n을 받았을 때 n 과 n의 각 자리를 더하기 위해 map함수를 사용합니다.
n을 문자열로 변환시키고 각 자리에 있는 숫자 하나 하나를 int로 변환해 리스트로 바꿔줍니다.
마지막으로 그 리스트에 sum함수를 적용해 각 자리의 합을 구합니다.

# 리스트 만드는 설명 #####
l = list(range(1, 10000+1))
#######################
1~10000까지의 수가 요소로 들어있는 리스트를 만들기위해 range 함수를 사용합니다.

# for 문과 try except문을 사용해 생성자가 존재하는 숫자 제거 ####
for i in range(1, 10000+1):
    try:
        l.remove(d(i))
    except:
        continue
######################################################
try except문을 사용해 이미 삭제된 요소를 삭제하려할 때 발생하는 오류를 처리해줍니다.

백준 BAEKJOON 1065

 

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

 

 

1065번: 한수

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

www.acmicpc.net

 

문제 해석

 

양의 정수 X의 각 자리가 등차수열을 이루면 그 수를 한수라고 한다.
N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 문제

 

풀이

 

import sys

def hansu(n):
    if n < 100: # 두자리 이하의 수는 무조건 각 자리가 등차수열을 이룸
        return True
    else: # 등차수열을 이루는지 확인 필요
        l = list(map(int, str(n))) # 각 자리에 접근하기위해 리스트로 변환
        gap = l[0] - l[1]
        for i in range(len(l)-1):
            if l[i] - l[i+1] != gap: # 자리별 수의 차이가 앞에서 구한 차이와 다를 경우 Flase
                return False
        return True

n = int(sys.stdin.readline())
cnt = 0

for i in range(1, n+1):
    if hansu(i):
        cnt += 1
        
print(cnt)

 

풀이 해석 및 팁

 

한수를 구할 때 숫자의 자릿수가 두자리 이하라면 무조건 등차수열을 이룬다.
따라서 세자리 이상인 숫자에 대해서만 각 자리별 숫자간의 차이가 균일한지를 검사해보아야한다.
검사 도중 차이가 다른경우 바로 False를 리턴해 필요없는 계산을 줄인다.

여기까지 백준 단계별 문제 풀이 함수편에 대한 내용이었습니다.

 

함수를 정의해 문제를 푸는것은 알고리즘 문제에 필요한 요소이기 때문에 앞으로도 문제를 풀 때마다 함수를

 

사용하는 습관을 들이는것을 추천드립니다.

 

다들 화이팅입니다. 궁금하신점이나 도움이 필요한 부분이 있다면 댓글로 남겨주시바랍니다.

 

감사합니다.

반응형