_Han_
나의 개발 노트
_Han_
  • 분류 전체보기 (272)
    • 데이터 엔지니어링 (29)
    • 인프라 (3)
    • 추천시스템 (11)
    • 코딩테스트 (146)
    • 부트캠프 회고 (15)
    • 회고 (4)
    • 자격증 (1)
    • 파이썬 프로그래밍 (6)
    • 통계 (2)
    • Git (21)
    • 유니티2D (33)

최근 글

반응형
hELLO · Designed By 정상우.
_Han_

나의 개발 노트

[코딩테스트] 프로그래머스 기사단원의 무기 파이썬(Python)
코딩테스트

[코딩테스트] 프로그래머스 기사단원의 무기 파이썬(Python)

2022. 11. 17. 17:25
반응형

 

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

 

프로그래머스

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

programmers.co.kr

import math
def solution(number, limit, power):
    len_divisors = []
    result = 0
    for n in range(1, number+1):
        len_divisors.append(get_len_divisor(n))
    for a in len_divisors:
        if a <= limit:
            result += a
        else:
            result += power
    return result
def get_len_divisor(n):
    result = []
    for i in range(1, int(math.sqrt(n))+1):
        if n % i == 0:
            result.append(i)
            if (i ** 2) != n:
                result.append(n // i)
    return len(result)

풀이는 문제에서 조건에 맞추어 구현 하였습니다.

def get_len_divisor(n):
    result = []
    for i in range(1, int(math.sqrt(n))+1):
        if n % i == 0:
            result.append(i)
            if (i ** 2) != n:
                result.append(n // i)
    return len(result)

약수의 개수를 구하는 함수를 작성하여 약수의 개수를 구하였습니다.

아래의 블로그를 참고하여 만들었습니다.

 

[Algorithm/Python] 파이썬 약수 구하기 (시간복잡도 줄여보기)

문제 1 이상의 자연수 N이 주어졌을 때, N의 약수 구하기 풀이 단순한 풀이 방법 def getMyDivisor(n): divisorsList = [] for i in range(1, n + 1): if (n % i == 0) : divisorsList.append(i) return divisorsList for 문을 이용해 범

minnit-develop.tistory.com

약수를 구할때 모든 수를 확인하지 않고 주어진 수의 제곱근까지의 수를 확인하며 N = A*B의 특징을 이용한 방법입니다.

 

예를 들어 10의 약수를 구할 때 [1,2,3,4,5,6,7,8,9,10] 모든 수를 확인해가며 약수를 확인하는 방법이 있습니다.

하지만 수가 커지면 그 만큼 시간이 오래 걸리게 됩니다.

 

10의 제곱근 까지의 수([1,2,3])를 구하면 시간을 줄일 수 있습니다.

 

10의 약수는 아래과 같이 표현할 수 있습니다.

10 = (1 * 10) or (2 * 5) 

약수를 구하면 그 약수에 해당하는 짝이 있음을 알 수 있습니다.

따라서 모든 수를 확인하지 않고 제곱근 까지의 수만 확인해도 약수를 구할 수 있습니다.

즉 작은 수의 짝을 찾으면 해당하는 큰 수를 찾을 수 있습니다.

 

또한 25의 약수를 구할 때 5가 두번 들어가는 것을 방지하기 위하여 i ** 2 != n의 조건이 들어간 것을 확인할 수 있습니다.

그리고 25의 제곱근인 5까지만 수를 확인해도 모든 약수를 구할 수 있음을 다시한번 확인할 수 있습니다.

for n in range(1, number+1):
        len_divisors.append(get_len_divisor(n))
    for a in len_divisors:
        if a <= limit:
            result += a
        else:
            result += power
    return result

문제에서 주어진대로 주어진 number까지의 약수의 개수를 구한 뒤에 조건에 맞추어서 값을 추가하여 문제를 해결하였습니다.

반응형

'코딩테스트' 카테고리의 다른 글

[코딩테스트] 프로그래머스 k진수에서 소수 개수 구하기 파이썬(Python)  (0) 2022.11.17
[코딩테스트] 프로그래머스 인기있는 아이스크림 MySQL  (0) 2022.11.17
[코딩테스트] 프로그래머스 이름이 있는 동물의 아이디 MySQL  (0) 2022.11.16
[코딩테스트] 프로그래머스 구명보트 파이썬(Python)  (0) 2022.11.16
[코딩테스트] 프로그래머스 다음 큰 숫자 파이썬(Python)  (0) 2022.11.16
    '코딩테스트' 카테고리의 다른 글
    • [코딩테스트] 프로그래머스 k진수에서 소수 개수 구하기 파이썬(Python)
    • [코딩테스트] 프로그래머스 인기있는 아이스크림 MySQL
    • [코딩테스트] 프로그래머스 이름이 있는 동물의 아이디 MySQL
    • [코딩테스트] 프로그래머스 구명보트 파이썬(Python)
    _Han_
    _Han_
    학습한 것을 기록합니다.

    티스토리툴바