프로그래밍 공부
작성일
2024. 4. 11. 10:40
작성자
WDmil
728x90

문제 설명


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


제한사항

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

입출력 예

nums result
[1,2,3,4] 1
[1,2,7,6,4] 4

문제 해설

 

쉽게 그냥 숫자의 중복값을 제외한 여러개의 숫자의 결과중복만 허용한 소수를 찾으면 된다.


첫 번째 시도

#include <vector>
#include <iostream>
#include <unordered_set>

using namespace std;

bool ChackTonum(int input)
{
    float def = input * 0.5;
    if (def == static_cast<int>(def)) return false;
    for (int i = 2; i <= def; i++) if (input % i == 0) return false;

    return true;
}

int solution(vector<int> nums) {
    int answer = 0;
    unordered_set<int> chackset;
    
    for(int One = 0; One < nums.size(); One++)
        for(int Tow = One+1; Tow < nums.size(); Tow++)
            for(int Three = Tow+1; Three < nums.size(); Three++)
            {
                int result = nums[One] + nums[Tow] + nums[Three];
                if(chackset.count(result) <= 0) {
                    chackset.insert(result);
                    answer += ChackTonum(result);
                }
            }
    return answer;
}

실패

 

조건항에 대한 중복을 제거하였으나, 그런 문항이 없어서 실패 결과덧셈이 같더라도, 과정이 다르면 다른 숫자결과로 보아야 한다.


두 번째 시도

#include <vector>
#include <iostream>

using namespace std;

bool ChackTonum(int input)
{
    float def = input * 0.5;
    if (def == static_cast<int>(def)) return false;
    for (int i = 2; i <= def; i++) if (input % i == 0) return false;

    return true;
}

int solution(vector<int> nums) {
    int answer = 0;
    for(int One = 0; One < nums.size(); One++)
        for(int Tow = One+1; Tow < nums.size(); Tow++)
            for(int Three = Tow+1; Three < nums.size(); Three++)
                    answer += ChackTonum(nums[One] + nums[Tow] + nums[Three]);

    return answer;
}

성공

전부다 확인하되, 결과값의 제외만 다 없애주면 된다.

728x90