본문 바로가기

Certificate/Cos Pro 1급 (Python)

[Cos Pro 1급] 기출문제 3회차, 소수의 합으로 표현하기

Hi, There!
안녕하세요, 바오밥입니다.


목차

  1. 문제
  2. 풀이

문제

문제 내용

어떤 수를 서로 다른 소수 3개의 합으로 표현하는 방법의 수를 구하려 합니다.

 

예를 들어 33은 총 4가지 방법으로 표현할 수 있습니다.

1. 3+7+23
2. 3+11+19
3. 3+13+17
4. 5+11+17

 

자연수 n이 매개변수로 주어질 때, n을 서로 다른 소수 3개의 합으로 표현하는 방법의 수를 return 하도록 solution 함수를 작성하려 합니다.

빈칸을 채워 전체 코드를 완성해주세요.

※ 1,000 이하인 소수는 168개 있습니다.

 

매개변수 설명

n이 solution 함수의 매개변수로 주어집니다.

  • n은 1,000 이하인 자연수입니다.

 

return 값 설명

n을 서로 다른 소수 3개의 합으로 표현하는 방법의 수를 return 해주세요.

  • 만약, n을 서로 다른 소수 3개의 합으로 표현할 수 없다면 0을 return 해주세요.

 

예시

 

예시 설명 

예시 #1 문제에 나온 예와 같습니다.

예시 #2 9는 서로 다른 세 소수의 합으로 나타낼 수 없습니다.


풀이

풀이 코드 및 해설 (에라토스테네스의 체)

import math
def get_primes(n):
    a = [0] * (n+1)  # a -> 0 : 소수, a -> 1 : 소수로 사용 불가
    for i in range(2, int(math.sqrt(n))+1): 
    # 2부터 n의 제곱근까지 반복
        if a[i] == 0: # 만약 i가 0이라면 (소수라면)
            for x in range(i+i, n+1, i): # i의 배수는 무조건 소수가 될 수 없음. 
                a[x] = 1 # i의 모든 배수를 1로 변경
    return [i for i in range(2, n+1) if a[i] == 0]
    # 2부터 n까지 순회하면서, 요소가 0인 값들만 반환

def solution(n):
    answer = 0
    primes = get_primes(n) # n까지의 소수 집합 저장
    prime_len = len(primes) # 소수 집합의 개수를 저장
    for i in range(0, prime_len - 2) : # 0부터 길이의 -2까지 
        for j in range(i + 1, prime_len - 1) : # 1부터 리스트 길이의 -1까지
            for k in range(j + 1, prime_len) : # 2부터 리스트 길이까지
     		# 3중 for문으로 세 개의 수를 비교
                if primes[i] + primes[j] + primes[k] == n :
                # 세 개의 수의 합이 n과 동일한 경우
                    answer += 1 # answer 값 누적
    return answer