오랑우탄의 반란
프로그래머스 | 기사단원의 무기 (파이썬) n의 약수 개수 구하기 본문
오늘도 오랑이는 문제를 풉니다.
기사단원의 무기
풀이 과정
- number 까지의 숫자들 각각의 약수의 개수 구하기
- 약수의 개수가 limit 이하인지 확인하기
- limit을 초과하는 경우 power 로 대체하기
- 최종 숫자들의 합 구하기
우선 약수의 개수부터 구해줍니다.
처음에 count = 0을 첫번째 for 문 밖에 둬서 계속 결과가 틀렸다고 나왔는데, number 이하의 모든 숫자에 대해 count가 리셋되도록 꼭 for문 안에 넣어줘야 합니다.
for num in range(1, number+1):
count = 0
for i in range(1, int(num**0.5)+1):
if num%i==0:
if i == (num // i):
count += 1
else:
count += 2
또한 약수를 구하는 과정에서 num 까지의 모든 수를 확인할 필요는 없고, 제곱근까지만 확인하면 훨씬 효율적입니다.
제곱근일 경우 약수가 하나뿐이기 때문에 1만 더해주고, 나머지 경우에 대해서는 2를 더해줍니다. (약수는 항상 짝을 이루기 때문)
이제 count 가 limit을 초과하는지의 여부, 만약 초과하는 경우 power 로 대체해주는 작업을 합니다.
처음에는 리스트에 count 값을 하나하나 저장해서 limit와 대조해보는 것을 생각했었는데,
최종 결과가 어차피 count의 합계를 구하는 것이기 때문에 answer 에 count를 더해주기만 해도 충분하더군요.
그렇기 때문에 마지막 단계인 최종 count들의 합 구하기와 동시에 진행해줍니다.
이때 answer = 0 은 for문 밖에 위치하도록 주의합니다.
반복문과 조건문이 많을 경우 항상 인덴트를 잘 해야 하는데 오랑이는 인덴트 실수가 잦습니다..
answer = 0
for num in range(1, number+1):
if count > limit:
answer += power
else:
answer += count
return answer
각 숫자 num 에 대해 먼저 인수 개수를 구한 후, 이어서 count 를 판별합니다.
count가 limit보다 클 경우 최종 답 answer 에 power 를 더해주고, 그게 아닌 경우 그대로 count를 더해줍니다.
두 코드를 합해주면 아래와 같습니다.
최종 코드
def solution(number, limit, power):
answer = 0
for num in range(1, number+1): # 각 숫자에 대해
# 약수 개수 구하기
count = 0
for i in range(1, int(num**0.5)+1):
if num%i==0:
if i == (num // i):
count += 1
else:
count += 2
# 약수 개수가 limit 이하인지 확인, 아니면 power로 대체
if count > limit:
answer += power
else:
answer += count
return answer
오랑우탄이 영어를 하고 오랑이가 코드마스터가 되는 그날까지~
'PYTHON > 프로그래머스' 카테고리의 다른 글
프로그래머스 | 옹알이(2) (파이썬) permutation, 정규표현식 fullmatch (0) | 2024.08.07 |
---|---|
프로그래머스 | 로또의 최고 순위와 최저 순위 (파이썬) 리스트 사용 (0) | 2024.08.07 |
프로그래머스 | 덧칠하기 (파이썬) (2) | 2024.08.06 |
프로그래머스 | 소수 만들기 (파이썬) combination, 에라토스테네스의 체 (0) | 2024.07.31 |
프로그래머스 | 모의고사 (Python3) Enumerate (2) | 2024.07.23 |