본문 바로가기
프로그래머스/C

[프로그래머스/C]프로그래머스 Level 1 : 소수만들기 C언어

by starfish22 2021. 11. 26.
728x90

▶문제 : 코딩 테스트 연습 - 소수 만들기 | 프로그래머스 (programmers.co.kr)

 

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

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

programmers.co.kr

 

▶코드 작성

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>

int func(int num)//소수 판별 함수
{
    for (int i = 2; i <= num / 2; i++)
    {
        if (num % i == 0)
        {
            return 0;
        }
    }
    return 1;
}

// nums_len은 배열 nums의 길이입니다.
int solution(int nums[], size_t nums_len)
{
    int answer = 0;
    int i, j, l;
    int m; //짝수 개수
    for (i = 0; i < nums_len - 2; i++)//배열길이보다 -2만큼
    {
        if (nums[i] % 2 == 0) m = 1; //짝수일 때 1
        else m = 0;
        for (j = i + 1; j < nums_len - 1; j++)//배열길이보다 -1만큼
        {
            if (nums[j] % 2 == 0) m++; //짝수일 때 +1
            for (l = j + 1; l < nums_len; l++)
            {
                if (nums[l] % 2 == 0) m++; //짝수일 때 +1
                if (m == 0 || m == 2)//세 숫자의 합이 홀수일 때
                {
                    if (func(nums[i] + nums[j] + nums[l]) == 1)//소수일 때
                    {
                        answer++;
                    }
                }
                if (nums[l] % 2 == 0) m--; // +1 했다면 다시 -1
            }
            if (nums[j] % 2 == 0) m--; // +1 했다면 다시 -1
        }
    }

    return answer;
}

 

▶해석

3중 반복문에 i값과 j값과 l 값을 효율적이게 초기값을 주었고, 각 세 숫자들의 합이 짝수인지 아닌지 확인하기 위해 변수 m을 이용해 짝수라면 +1 하고 m의 값이 0 또는 2라면 세 숫자들의 합이 홀수이기 때문에 소수 판별 함수에 적용하도록 만들었다.

728x90

댓글