[프로그래머스] 소수 만들기
Programmers - [Summer/Winter Coding(~2018)] 소수 만들기
사용 언어 - C++
소요 시간 - 약 60분(정해둔 시간 40분에서 20분 초과)
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12977
문제 요약
- 숫자가 담긴 배열 nums에서 서로 다른 3개의 정수를 뽑아 더함
- 더해진 숫자가 소수인지 판별
최종 코드
#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;
}
트러블 슈팅
- 어디선가 구하려는 수의 제곱근까지의 숫자로 나눠보면 소수인지 판별이 가능하다고 본 것 같아 제곱근까지만 나눠서 해보려고 해봄 → 코드 실행 단계까지는 잘 풀렸는데 제출 단계에서 오답 투성이가 됨 → 시간이 초과되고 나서 정답이라도 맞추기 위해 n까지 나누는걸로 변경. 반복을 너무 많이 도는 것 같아 한번쯤 반복을 줄일 수 있는 방법을 고민해 보는 것도 좋을 것 같음
풀이 절차
- i는 배열의 0번 인덱스부터
- j는 배열의 i + 1번 인덱스부터
- k는 배열의 j + 1번 인덱스부터 마지막 인덱스까지
- 세 수의 합의 모든 경우의 수를 구해 각각 소수인지를 판별
- 소수라면 answer++
문제 풀이 후 소감
- 어디서 본 그런 불확실한 정보보다는 내가 확실하게 풀 수 있는 방법으로 접근하는 것이 좋을 거라는 생각을 하게 됨
- 지금까지 코테 풀면서 처음으로 정해둔 시간 내에 풀지 못함. 조금 더 문제 접근에 신중해야할 것 같음 ⭐