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



Programmers - [Summer/Winter Coding(~2018)] 소수 만들기




사용 언어 - C++

소요 시간 - 약 60분(정해둔 시간 40분에서 20분 초과)




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12977




문제 요약

  1. 숫자가 담긴 배열 nums에서 서로 다른 3개의 정수를 뽑아 더함
  2. 더해진 숫자가 소수인지 판별




최종 코드

#include <vector>
#include <iostream>
#include <cmath>
using namespace std;

bool IsPrime(int n)
{
    if(n == 0 || n == 1) return false;
    
    for(int i = 2; i < n; i++)
        if(n % i == 0) return false;
    
    return true;
}

int solution(vector<int> nums) {
    int answer = 0;

    for(int i = 0; i < nums.size(); i++)
    {
        for(int j = i + 1; j < nums.size(); j++)
        {
            for(int k = j + 1; k < nums.size(); k++)
            {
                int temp = nums[i] + nums[j] + nums[k];
                if(IsPrime(temp) == true) answer++;
            }
        }
        
    }

    return answer;
}




트러블 슈팅

  1. 어디선가 구하려는 수의 제곱근까지의 숫자로 나눠보면 소수인지 판별이 가능하다고 본 것 같아 제곱근까지만 나눠서 해보려고 해봄 → 코드 실행 단계까지는 잘 풀렸는데 제출 단계에서 오답 투성이가 됨 → 시간이 초과되고 나서 정답이라도 맞추기 위해 n까지 나누는걸로 변경. 반복을 너무 많이 도는 것 같아 한번쯤 반복을 줄일 수 있는 방법을 고민해 보는 것도 좋을 것 같음




풀이 절차

  1. i는 배열의 0번 인덱스부터
  2. j는 배열의 i + 1번 인덱스부터
  3. k는 배열의 j + 1번 인덱스부터 마지막 인덱스까지
  4. 세 수의 합의 모든 경우의 수를 구해 각각 소수인지를 판별
  5. 소수라면 answer++




문제 풀이 후 소감

  • 어디서 본 그런 불확실한 정보보다는 내가 확실하게 풀 수 있는 방법으로 접근하는 것이 좋을 거라는 생각을 하게 됨
  • 지금까지 코테 풀면서 처음으로 정해둔 시간 내에 풀지 못함. 조금 더 문제 접근에 신중해야할 것 같음 ⭐