TIL ... 2주차 Algorithm day 7- 알고리즘 문제 회고 - 22.05.17

BYEONGMIN CHOI·2022년 5월 17일
0

TIL(Today I Learned)

목록 보기
5/24

알고리즘 문제를 풀며 발생한 이슈에 대해 작성해 볼려고 한다.

알고리즘 문제의 경우 프로그래머스문제 중 소수 만들기문제이다. (링크로 확인가능)

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

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

<예시>

문제를 풀기전에 소수의 특성을 고민하였다. 1을 제외한 자기 자신으로 나눴을 때만 나머지가 0인 수를 소수라고 한다.
주어진 배열에서 3개의 수를 더하는 부분에서 경우의 수가 발생하는 부분을 처리하고 소수인지 아닌지를 판별하여 카운트 한다고 생각하였다.

소수판별법의 경우 구글링을 통하여 진행하였으며 주어진 수의 양의 제곱근 이하의 수들로 주어진 수를 나눠서 한 번이라도 나누어떨어지면 합성수, 아니면 소수라는 개념을 가지고 진행하였다.( 참고사이트 )

// 최종 코드
import java.util.*;

class Solution {

    public int solution(int[] nums) {
        int cnt = 0;
        int check = 0;
		// 3중 for문을 통해 3개의 수를 더할때 가질 수 있는 경우의 수를 찾음
        for (int i = 0; i < nums.length - 2; i++) {
            for (int j = i + 1; j < nums.length - 1; j++) {
                for (int k = j + 1; k < nums.length; k++) {
                    int sum = (nums[i] + nums[j] + nums[k]);
                    for (int l = 2; l <= (int)Math.sqrt(sum); l++) {
                        if(sum % l == 0) {
                            check++;
                        }
                    }
                    if(check == 0) cnt++;
                    check = 0;
                }
            }
        }
        return cnt;
    }
}

위의 코드가 최종 코드이며 처음에 발생했던 이슈에 대해선 분할 코드로 나타낼 것이다.

for (int l = 2; l <= (int)Math.sqrt(sum); l++) { 
// 2번째 이슈 : l의 범위를 소수인 2를 포함하지 않았다. l < (int)Math.sqrt(sum)
	if(sum % l == 0) {
    	check++;
    }
}
if(check == 0) cnt++;
check = 0;  // 1번째 이슈 : check를 초기화 하는 부분이 없었다.

위의 코드는 소수인지 아닌지를 확인하는 부분의 코드이다. 첫번재 이슈는 check 변수의 초기화 이슈였다. 소수가 아닐때 조건문을 실행하고 check 변수가 증가하는데, 주어진 sum 변수에 대해 for문이 끝난 후 새로 sum변수가 주어질 때 check 변수를 시키지 않아 모든 경우 수가 소수가 아니라는 결과를 도출하였다.

두번째 이슈로는 int l = 2; l < (int)Math.sqrt(sum); l++ for문 안의 범위 이슈였다.
숫자 2는 소수이므로 sum의 제곱근 이하의 수들에 포함된다. 하지만 처음엔 범위내에 포함시키지 않아 소수가 아닌경우의 결과도 결과에 추가되는 이슈가 발생하였다.

이번 알고리즘 문제를 풀며 잘못된 로직을 찾는데 많은 시간을 사용하였다. 항상 주어진 조건을 잘 고민하며, 코드를 짤때 코드의 로직을 잘 세워야 겠다.

profile
스스로 성장하는 개발자가 되겠습니다.

0개의 댓글