코딩테스트 연습 - 약수의 개수와 덧셈 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
제한사항
1 ≤ left ≤ right ≤ 1,000
입출력 예
left | right | result |
13 | 17 | 43 |
24 | 27 | 52 |
풀이
아이디어: left와 right의 약수를 모두 구해서 리스트에 넣고, 길이가 짝수인지 판단
def solution(left, right):
num=0
for i in range(left,right+1):
answer=[]
for j in range(1,i+1):
if i%j == 0:
answer.append(j)
if len(answer)%2 == 0:
num += i
else:
num-=i
return num
left부터 right까지 모든 수를 순회하도록 for문을 만들어주고
각각의 숫자의 약수를 구한다.
약수의 범위는 1부터 자기자신까지이고, 범위 내에서 나누었을때 나머지가 0인지로 약수를 구별한다.
이후에는 약수의 개수가 짝수인지 판단하여 숫자를 더하거나 빼는 조건을 걸어준다.
다른 효율적인 풀이
def solution(left, right):
answer = 0
for i in range(left,right+1):
if int(i**0.5)==i**0.5:
answer -= i
else:
answer += i
return answer
-> 제곱수의 약수는 홀수개인 것을 이용한 풀이이다. int(i**0.5) == i**0.5 로 i가 제곱수인지 판단한다.
제곱수가 아닌 수의 약수는 곱해지는 쌍이 존재하기 때문에 약수의 개수가 짝수개이다.
(이런 수학 개념들은 다 까먹은 이과..)
def solution(left, right):
return sum(n if (n ** 0.5) % 1 else -n for n in range(left, right + 1))
-> 0은 False이고, 다른 숫자들은 True인 것을 이용한 신박한 코드였다.
제곱수들은 (n**0.5)%1이 0이다. 루트를 씌웠을 때 나누어 떨어지기 때문이다.
반면 다른 수들은 소수점이 존재할테니 1로 나누면 나머지 값이 존재할 것이고, 이 수들은 True로 조건문으로 들어간다.
'문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스 Lv.1] 문자열 다루기 기본 (Python) (0) | 2024.07.10 |
---|---|
[프로그래머스 Lv.1] 부족한 금액 계산하기 (Python) (0) | 2024.07.10 |
[프로그래머스 Lv.1] 내적 (Python) (0) | 2024.07.10 |
[프로그래머스 Lv.1] 수박수박수박수박수박수? (Python) (0) | 2024.07.10 |
[프로그래머스 Lv.1] 없는 숫자 더하기 (Python) (0) | 2024.07.09 |