-
[백준 9506] 약수들의 합 - Python3알고리즘 문제 풀이/BOJ 2021. 1. 10. 23:00
[백준 9506] 약수들의 합 - Python
<문제>
- 숫자 N이 주어졌을 때 이 수가 완전수인지 판별해서 출력을 달리하는 문제다.
- 완전수 : 어떤 자연수 n이 자신을 제외한 약수들의 합으로 표현되는 수
<입력>
자연수 혹은 -1
<출력>
주어진 수가 완전수이면 그 수와 약수들의 합 전개식을 출력하고 아니면 'is NOT perfect'를 출력한다.
<풀이>
(1)
그다지 어려운 문제는 아니었다. 먼저 주어진 수의 약수들을 구하고 이를 각각 더해서 저장할 변수(sum)와 출력 형식을 위해 모든 약수를 저장할 리스트(factors)를 선언해서 약수가 맞다면 각각 더하고, 추가하는 식으로 풀었다.
약수를 판별하는 부분에서는 반복하는 범위를 그냥 1~n으로 하려고 했으나 혹시라도 타임아웃이 뜰 것을 염려해서(사실 그다지 큰 차이는 없겠지만) 어차피 입력값 n의 약수 중에 스스로를 제외하고 제일 큰 약수라면 2로 나눈 n/2일 것이기 때문에 범위를 줄였다.
그 외에는 간단하다. 문제가 원하는 대로 출력했다.
def is_perfect(n): sum = 0 factors = [] for i in range(1,int(n/2+1)): if n%i == 0: sum += i factors.append(i) if sum==n: print(f'{n} = {factors[0]}',end='') for i in range(1, len(factors)): print(f' + {factors[i]}',end='') print() else: print(f'{n} is NOT perfect.') while 1: n = int(input()) if n==-1: break is_perfect(n)
왜인지 모르게 소소한 취미로 백준에서 문제를 풀어보고 정답을 맞힌 뒤에 숏코딩을 찾아보는 재미가 생겼다. 아무래도 코드 작성을 아주 사소한 부분이라도 효율적으로 짤 수 있을 것 같아서 찾아보고 있기는 한데, 그런 습관을 몇 번 들이다 보니까 단번에 효율적인 코드를 짜지는 못해도 몇 번 계속해서 쳐다보거나 수정하다 보면 조금씩 그런 방향으로 코딩하게 되는 것 같다.
이번 문제를 풀고 블로그 포스팅을 하는 지금, 코드가 조금 더 수정되서 더 짧고 명확하게 표현할 수 있을 것 같다는 생각이 든다. factors를 빈 문자열로 선언해서 약수와 ' + '를 붙여서 생성한 뒤에 출력할 때에만 인덱싱을 factors[:-3]으로 하면 조금 더 짧아지고 불필요한 자료구조와 반복을 피할 수 있을 거라는 생각이 든다. 내 PC에 보관될 코드는 지금 말한 대로 수정하겠지만 블로그에는 이대로 보관해서 '코드가 이렇게 달라졌다.'라고 느낄 수 있게 자취를 남기는 게 좋을 것 같다.
<풀이 인증>
간단한 문제는 간간히 풀어보고, 조금 더 심화된 문제들에 손을 대봐야겠다. 근래의 나태함으로 인해 굳은 머리는 수학적, 알고리즘적 사고를 하기엔 부적합 하겠지만 어쩔 수 없다. 억지로라도 해서 굳은 뇌를 다시 유연하게 만들어줘야지...
문제 출처 : www.acmicpc.net/problem/9506
'알고리즘 문제 풀이 > BOJ' 카테고리의 다른 글
[백준 1018] 체스판 다시 칠하기 - Python3 (0) 2021.02.15 [백준 2231] 분해합 - Python3 (0) 2021.02.08 [백준 1002] 터렛 - Python3 (0) 2021.01.23 [백준 11653] 소인수분해 - Python3 (0) 2021.01.17 [백준 1920] 수 찾기 (이진 탐색) - Python3 (0) 2021.01.03