본문 바로가기

알고리즘 삽질장

[프로그래머스] 소수 만들기

반응형


문제설명

https://programmers.co.kr/learn/courses/30/lessons/12977

 

코딩테스트 연습 - 소수 만들기

주어진 숫자 중 3개의 수를 더했을 때 소수가 되는 경우의 개수를 구하려고 합니다. 숫자들이 들어있는 배열 nums가 매개변수로 주어질 때, nums에 있는 숫자들 중 서로 다른 3개를 골라 더했을 때

programmers.co.kr

사고과정

  • 문제에서 주어진 nums 에서 3개를 뽑아 만들 수 있는 경우의 수를 구하고 그 합이 소수인지 판별해서 소수라면 카운트하는 문제였다.
  • nums에서 3개를 뽑아 만들 수 있는 경우의 수를 구하기 위해 중복을 허용하지 않는 3개를 뽑는 조합을 DFS로 하나하나씩 탐색하면서 한 조합을 구했을 때, 그 원소의 합이 소수인지 판별하는 로직으로 구현했다.
  • 그래서 소수 판별하는 함수 1개, 조합을 DFS로 탐색하는 함수 2가지로 만들어 구현했다. 
  • 나름 평이하게 구현했지만, 프로그래머스 문제 특성상 def solution 이라는 하나의 함수가 주어지는 문제라는 특성 때문에 전역 변수 정의할 때 고민했다. DFS 함수 내에서 count + 1 해주어야 하는데, global 키워드를 넣어주어야 하는데 solution 함수랑 dfs 함수에 둘 다 선언해주어야 할지 고민했다.
  • 그 결과로, 배운점은 메인스크립트 영역인 전역에서 변수를 정의했을 때, def solution 안에서 global로 전역변수를 선언하지 않고 solution 함수 내의 dfs 함수내에서만 global count로 전역변수를 정의해주기만 해도 에러가 발생하지 않았다는 것!

풀이

import math

count = 0

def is_prime_number(x):
    if x == 0 or x == 1:
        return False
    for i in range(2, int(math.sqrt(x))+1):
        if x % i == 0:
            return True
    return False

def solution(nums):
    # nums 중에 3개를 뽑는 조합의 경우의 수 DFS로 수행
    res = [0] * 3
    n = len(nums)
    
    def dfs(L, idx):
        global count
        if L == 3:
            if not is_prime_number(sum(res)):
                count += 1
            return
        else:
            for i in range(idx, n):
                res[L] = nums[i]
                dfs(L+1, i+1)
        
    dfs(L=0, idx=0)
    
    return count
반응형