본문 바로가기
프로그래머스/Python

[프로그래머스] 기사단원의 무기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 8. 7.
728x90
반응형

 

 

프로그래머스

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

programmers.co.kr

 

1. 문제 설명

2. 풀이과정

  1. 구매할 무기의 공격력을 저장할 리스트를 생성하고 최소 값인 1로 초기화한다. result = [1] * number
  2. 1은 약수가 1 자기 자신으로 1개이다. 하여 약수의 개수를 구할 필요가 없으므로 다음 숫자인 2부터 시작하여 기사단원의 수만큼 각 약수의 개수를 구한다. for i in range(2, number + 1)
  3. 각 수별로 약수를 저장할 리스트를 생성한다. li = list()
  4. 약수는 1부터 자기 자신까지 수 중에 나누어 떨어지는 수인데, 여기서 자기 자신까지 모두 확인하여 약수를 구하면 시간 초과를 피할 수 없게 된다.
  5. 이때 약수는 나누는 수와 나누었을 때 몫, 이렇게 두 개의 약수를 한 번에 구할 수 있다. 하여 해당 수의 절반까지만 반복하여 약수를 구하면 되는데, 여기서 또 한 가지 나누는 수는 해당 수를 소수인지 판별할 때처럼 제곱근까지만 판별하면 된다. for j in range(1, int(i ** 0.5) + 1)
  6. 만약 해당 수가 나누어 떨어지면 if (i % j == 0)
  7. 나누는 수를 약수에 추가하고 li.append(j)
  8. 나누고 난 몫의 결과 또한 약수이므로 추가해 준다. li.append(i // j)
  9. 해당 수의 약수를 모두 구했으면 약수 리스트에서 중복된 원소를 제거한 세트로 바꾼 결과의 원소 개수가 제한수치를 초과했다면 if (len(set(li)) > limit)
  10. 해당 기사는 지정한 공격력을 가진 무기를 구매해야 한다. result[i - 1] = power
  11. 초과하지 않았다면 else
  12. 약수의 개수와 동일한 값의 공격력을 가진 무기를 구매할 수 있다. result[i - 1] = len(set(li))
반응형

3. 소스코드

def solution(number, limit, power):
    answer = 0
    
    result = [1] * number
    for i in range(2, number + 1):
        li = list()
        for j in range(1, int(i ** 0.5) + 1):
            if (i % j == 0):
                li.append(j)
                li.append(i // j)
        
        if (len(set(li)) > limit):
            result[i - 1] = power
        else:
            result[i - 1] = len(set(li))
            
    answer = sum(result)
    
    return answer
728x90
반응형