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

Alal11·2022년 7월 28일
0
post-thumbnail

출처

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


문제 설명

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


제한사항

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


입출력 예

numsresult
[1, 2, 3, 4]1
[1, 2, 7, 6, 4]4

입출력 예 설명

입출력 예 #1

[1, 2, 4]를 이용해서 7을 만들 수 있습니다.

입출력 예 #2

[1, 2, 4]를 이용해서 7을 만들 수 있습니다.
[1, 4, 6]을 이용해서 11을 만들 수 있습니다.
[2, 4, 7]을 이용해서 13을 만들 수 있습니다.
[4, 6, 7]을 이용해서 17을 만들 수 있습니다.


➡️문제 분석

서로 다른 세 수의 합이 소수인지 판단하고, 소수가 되는 경우의 개수를 반환한다.

<소수>
1과 자기 자신만을 약수로 가지는 수


➡️코드(⭕)

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

// nums_len은 배열 nums의 길이입니다.
int solution(int nums[], size_t nums_len) {
    
    int answer = 0;
    int sum = 0;

    for (int i = 0; i < nums_len; i++) {				// 배열에서 숫자 3개 고르는 반복문
        for (int j = i + 1; j < nums_len; j++) {
            for (int k = j + 1; k < nums_len; k++) {
                
                sum = nums[i] + nums[j] + nums[k];		// 중복되지 않은 3가지 숫자의 합

                int count = 0;							// sum의 약수의 개수 구할 변수

                for (int h = 2; h < sum; h++) {			// 약수의 개수를 구하는 반복문
                    if (sum % h == 0)
                        count++;
                }
                if (count == 0)							// 약수의 개수가 0일 때 answer++
                    answer++;
            }
        }
    }
    return answer;
}

➡️코드 분석

  1. for 반복문을 이용하여 배열 nums에 있는 숫자가 겹치지 않게 3개의 수를 구한다.

  2. 구한 3개의 수의 합을 sum에 담는다.

ex) nums이 [1, 2, 3, 4]이면, nums_len = 4가 된다.

첫 번째: i=0, j=1, k=2 / sum = nums[0] + nums[1] + nums[2] = 1 + 2 + 3 = 6

두 번째: i=1, j=2, k=3 / sum = nums[1] + nums[2] + nums[3] = 2 + 3 + 4 = 9

세 번째: i=2, j=3, k=4 에서 k < nums_len 조건식이 만족하지 못하므로 반복문은 끝난다.
  1. sum을 1과 자기 자신을 제외한 범위의 수 h로 나눈 나머지가 0이면
    그 h가 sum의 약수가 되고, 약수의 개수만큼 count++를 해준다.

  2. 마지막 if문에서 count가 0이면, sum은 소수이기 때문에 answer++로 소수의 개수를 구하고 값을 반환한다.


➡️end

혼자 풀기엔 어려워서 다른 분들의 코드를 참고했다.
처음엔 코드를 봐도 이해가 되지 않아서 힘들었지만 천천히 분석 하다보니 이해가 됐다.

0개의 댓글