알고리즘

[프로그래머스] LV1. 기사단원의 무기

j9972 2023. 3. 11. 15:26
728x90

문제

https://school.programmers.co.kr/learn/courses/30/lessons/136798

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

접근

1. 간단한 약수의 개수 구하는 문제

2. 인줄 알았는데 시간초과 남..

3. n+1 까지가 아니라 int(n**(0.5)) + 1 & 제곱근은 한번만 더해 중복을 피하는 것을 생각하기

 

풀이

실패 코드

# 약수 개수 구하는 메소드
def counting(n):
    cnt = 0
    for i in range(1,n+1):
        if n % i == 0:
            cnt += 1
    return cnt

def solution(num, limit, power):
    answer = 0
    
    for n in range(1,num+1):
        if counting(n) > limit:
            answer += power
        else:
            answer += counting(n)
    return answer

 

정답 코드

# 약수 개수 구하는 메소드
def counting(n):
    cnt = 0
    for i in range(1,int(n**(1/2))+1):
        if n % i == 0:
            if i == n//i: # 제곱근일 경우 -> 1개만 카운트하기
                cnt += 1
            else:
                cnt += 2
    return cnt

def solution(num, limit, power):
    answer = 0
    
    for n in range(1,num+1):
        if counting(n) > limit:
            answer += power
        else:
            answer += counting(n)
    return answer

 

참고

분명 맞는데,,,왜 시간초과가 나지?? -> n+1 까지가 아니라 int(n**(0.5)) + 1 & 제곱근은 한번만 더해 중복을 피한다라는 생각을 알려주심

https://chan-lab.tistory.com/35

 

[프로그래머스] 기사단원의 무기 파이썬 알고리즘 문제풀이 (약수의 개수 구하기)

안녕하세요. 은공지능 공작소의 파이찬입니다. 오늘은 level 1 "기사단원의 무기" 문제 풀어보겠습니다. 효율적으로 약수의 개수를 구하는 방법이 중요한 문제입니다. 해당 문제 바로가기 링크 ↓

chan-lab.tistory.com