[python]소수 만들기

eunvi·2021년 12월 8일
0

프로그래머스

목록 보기
9/25
post-thumbnail

Summer/Winter Coding(~2018)>소수 만들기

[문제 설명]
주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때 소수가 되는 경우의 개수를 return 하도록 solution 함수를 완성해주세요.


[제한사항]

  • nums에 들어있는 숫자의 개수는 3개 이상 50개 이하입니다.
  • nums의 각 원소는 1 이상 1,000 이하의 자연수이며, 중복된 숫자가 들어있지 않습니다.

[입출력 예]

[입출력 예 설명]

입출력 예 #1

  • [1,2,4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2

  • [1,2,4]를 이용해서 7을 만들 수 있습니다.
  • [1,4,6]을 이용해서 11을 만들 수 있습니다.
  • [2,4,7]을 이용해서 13을 만들 수 있습니다.
  • [4,6,7]을 이용해서 17을 만들 수 있습니다.

나의 풀이

생각해보기!

def solution(nums):

    answer = 0 # 경우의 수
    sum = [] # i+j+k 합 담을 리스트
    
    for i in nums[:-2]: #1
        for j in nums[nums.index(i)+1:-1]: #2
            for k in nums[nums.index(j)+1:]: #3
                sum.append(i+j+k)
	
    for m in sum:
        count = 0 
        for l in range(2,m):
            if m % l != 0:
                count += 1
        if count == m-2:
            answer += 1
            
    return answer
  • nums에 있는 숫자들 중 서로 다른 3개(i,j,k)를 골라 더하기 위해 #1, #2, #3 for문의 리스트를 슬라이싱했다.

    • #1 : nums[:-2]
      i의 범위를 뒤에서 두 번째 원소 전까지로 제한했다.

    • #2 : nums[nums.index(i)+1:-1]
      i의 인덱스에 +1 하여 이전에 대입한 원소는 제외하고 뒤에서 첫 번째 원소까지 제한했다.

    • #3 : nums[nums.index(j)+1:]
      j의 인덱스에 +1 하여 이전에 대입한 원소를 제외했다.

  • 소수 : 1과 자기 자신만을 약수로 가지는 수

    • i+j+k를 2부터 m-1(=i+j+k-1)까지 나눠서 나머지가 0이 아닐 때 count에 1씩 더했다.

    • m에서 1과 m(=i+j+k) 자기 자신을 뺀 m-2count가 같을 때 answer에 경우의 수를 더했다.


문제를 풀면서 틀린 부분이 없는데 정확성이 23.1에서 향상되지 않아 고생했다. 질문하기에서 같은 사례가 있어 참고하여 맞출 수 있었다.

오답 해결하기!

  • 리스트 원소 3개의 합이 중복되는 경우도 포함되어야 통과 가능하다.
  • 중복을 set 함수로 제거하면 안된다.
    • 합이 20으로 같지만 i, j, k의 경우의 수는 2개이다.
      i, j, k = 2 ,8, 10 ➡ 합 : 20
      i, j, k = 4 ,6, 10 ➡ 합 : 20

지금까지 문제 중 가장 오래 걸렸다.😫

다른 사람의 풀이 #1

def solution(nums):

    from itertools import combinations as cb
    
    answer = 0
    
    for a in cb(nums, 3): 
        cand = sum(a)
        for j in range(2, cand):
            if cand%j==0:
                break
        else:
            answer += 1
            
    return answer

참고하세요!

  • combinations() : 반복없이 3가지 원소 조합 추출
profile
please study

0개의 댓글

관련 채용 정보