개발 일기

프로그래머스 레벨1 소수구하기 (JAVA) 본문

알고리즘/programmers

프로그래머스 레벨1 소수구하기 (JAVA)

dev-jo 2021. 7. 9. 02:36

 

 

퇴근 후 너무 피곤하지만

 

하루에 한 문제 정도는 풀어보기 위하여 오늘도 레벨 1부터 한 문제 씩 풀어본다..

 

오늘 푼 문제는

 

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

 

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

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

programmers.co.kr

 

프로그래머스 레벨1 소수 만들기 다

 

푼 모든 알고리즘 문제는 GitHub

깃허브에도 올려놓았다.

 

import java.util.ArrayList;
import java.util.List;

/**
 * 소수 만들기
 */

public class Programmers12977 {

    public static void main(String[] args) {
//        System.out.println(solution(new int[]{1,2,3,4}));
        System.out.println(solution(new int[]{1, 2, 7, 6, 4}));
    }

    public static int solution(int[] nums) {

        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                for (int m = j + 1; m < nums.length; m++) {
                    list.add(nums[i] + nums[j] + nums[m]);
                }
            }
        }

        return (int) list.stream().filter(num -> {

            boolean flag = true;

            int sq = (int) Math.sqrt(num);
            for (int i = 2; i <= sq; i++) {
                if (num % i == 0) {
                    flag = false;
                }
            }
            return flag;
        }).count();
    }

}

 

 

처음 for문에서 경우의수를 구해주고 list에 넣어준다.. ( 3중 for 문이라니.. 공부를 더해야겠다 )

 

그리고 바로 스트림을 써서 값을 구해줬다

 

return list.stream().filter(num ->)

 

값을 하나하나 꺼내 num에 넣어주고

 

제곱근으로 소수를 판별해주었다

 

filter 에서 return이 true 가 된다면 그 값은 list 안에 보존된다.

 

return false 가 된다면 그 값은 list에서 제거된다.

 

판별 후. count();

 

소수만 남은 list의 count를 return 시켜줬다.!

 

 

 

 

후기 

 

1. 람다를 쓰면 역시 속도가 안 나온다.

2. 3중 for 문보다 더 좋은 방법이 있을 거 같은데 나중에 다시 풀어봐야겠다.