기타/코딩테스트
[Python] 프로그래머스 - 기사단원의 무기
lazy man
2023. 8. 2. 22:43
1. 문제정보
https://school.programmers.co.kr/learn/courses/30/lessons/136798
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 풀이
약수의 갯수를 구하는 로직에서 시간초과를 해결하는 것이 핵심인 문제이다. 첫 시도에서 n의 약수를 구하기 위해 1부터 n까지 탐색을 진행했는데 타임아웃이 발생하면서 실패했다. 그래서 1부터 (제곱근+1) 까지 탐색을 진행했는데 여기서 약수의 갯수를 카운팅하는 아이디어가 부족해서 결국 혼자서 해결하지 못했다.
자연수n을 1부터 (n의 제곱근+1)까지 탐색하면서 나누어지는지 비교해보자. 예를 들어 n이 2로 나누어진다는 것은 n = 2 * (n/2) 라는 것이기 때문에 약수의 갯수를 2개 증가시켜야 했다. 이 경우에도 n이 제곱수인 경우를 고려해야 하는데 제곱수인 경우 1를 감소시켜 해결했다.
3. 코드
# 오류코드
import math
def solution(number, limit, power):
answer = 0
for i in range(1, number+1):
n = i
cnt = 0
for j in range(1, i+1):
if i % j == 0:
cnt += 1
cnt = power if cnt > limit else cnt
answer+= cnt
return answer
# 정답코드
import math
def solution(number, limit, power):
answer = 0
for i in range(1, number+1):
cnt = 0
for j in range(1, int(math.sqrt(i))+1):
if i % j == 0:
cnt += 2
if j*j == i:
cnt -= 1
cnt = power if cnt > limit else cnt
answer+= cnt
return answer