코딩테스트/PYTHON

[프로그래머스][PYTHON] Lv. 1 소수 만들기

_알파카 2024. 8. 22. 15:59
728x90

문제 설명

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

 

프로그래머스

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

programmers.co.kr

 

주어진 배열에서 숫자를 3개 골라 더한 값 중

소수의 개수를 구하는 문제이다. 

 

첫 번째 풀이 (오답)

# 소수 구하는 함수
def find_num(num):
    for i in range(2, int(num**0.5)+1):
        # 소수가 아니면 break
        if num % i == 0:
            break
    # 소수면 해당 숫자 반환
    else:
        return num     

def solution(nums):
    # 3개의 수를 더한 값을 저장할 set 선언
    answer = set()
    # 소수의 개수를 셀 count 변수
    count = 0
    
    # 3개의 수를 더함
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            for k in range(j+1, len(nums)):
                number = nums[i] + nums[j] + nums[k]
                # set은 중복을 제거함
                answer.add(number)
    
    answer = list(answer)
    # 3개의 수를 더한 배열을 순회하며 소수를 찾음
    for a in answer:
        if find_num(a):
            count += 1
    return count

 

처음에 푼 풀이는 위와 같다. 

1. 먼저, 3개의 수를 더한 값을 저장할 set을 선언한다. 

2. 주어진 배열 nums에서 3개를 골라 수를 더하는 루프를 실행한다. 

3. 앞서 선언한 set에 더한 값을 저장한다. 

4. 이 후, 모든 더한 값을 순회하며 소수인지 판단한다. 

 

 

그러나, 이 풀이는 23점 밖에 나오지 않는다. 

그래서 어디가 문제가 될지 곰곰히 생각해보았다. 

 

 

두 번째 풀이 (정답)

# 소수 구하는 함수
def find_num(num):
    for i in range(2, int(num**0.5)+1):
        # 소수가 아니면 break
        if num % i == 0:
            return False
    # 소수면 해당 숫자 반환
    else:
        return True     

def solution(nums):
    # 소수의 개수를 셀 count 변수
    count = 0
    
    # 3개의 수를 더함
    for i in range(len(nums)):
        for j in range(i+1, len(nums)):
            for k in range(j+1, len(nums)):
                number = nums[i] + nums[j] + nums[k]
                # 해당 수가 소수이면 count += 1
                if find_num(number):
                    count += 1

    return count

 

set을 사용하는 것이 꼭 필요 없을 것 같아 없애보았다. 

그냥 3개를 골라 값을 더한 후, 이 값이 소수이면 바로 count에 1을 더하도록 하였다! 

 

 

다른 사람 풀이

from itertools import combinations

def solution(nums):
    answer = 0
    for i in combinations(nums, 3):
        s = sum(i)
        chk = True
        for j in range(2, int(s ** 0.5) + 1):
            if s % j == 0:
                chk = False
                break
        if chk is True:
            answer += 1
    return answer

 

itertools 라이브러리의 combinations를 사용해 숫자 3개를 선택하는 풀이이다! 

나랑 전체적인 코드 흐름은 같지만, 

좀 더 라이브러리를 효율적으로 활용한 풀이이다. 

 

 

728x90