[프로그래머스] 소수 만들기 - Java, 자바

Kim Ji Eun·2022년 3월 24일
0

난이도

레벨 1

문제

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

풀이

주어진 수 중 3개의 수를 뽑아야했다. -> 백트래킹으로 접근
문제 채점 속도가 조금 느렸지만 정답이었다.

레벨1인데 복잡하게 생각한 것 같아서 다른 풀이를 찾아보니 for문으로 간단하게 세개의 수를 구할 수 있는 방법을 알게 되었다.

레벨1 수준에서 복잡하게 생각하지 말고 간단하게 풀 수 있는 방법으로 접근하는 방법을 기르자.

코드

1) for문으로 세 수의 합 구하기

import java.util.*;
class Solution {
    public int sum;
    public int answer = 0;

    public int solution(int[] nums) {
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                for (int k = j + 1; k < nums.length; k++) {
                    System.out.println(nums[i] + " " + nums[j] + " " + nums[k]);
                    int num = nums[i] + nums[j] + nums[k];
                    if (isPrime(num)) {
                        answer++;
                    }
                }
            }

        }
   
        return answer;
    }

    public boolean isPrime(int x) {
        if (x == 0 || x == 1) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(x); i++) {
            if (x % i == 0)
                return false;
        }
        return true;
    }
}

1) 백트래킹으로 세 수의 합 구하기

import java.util.*;
class Solution {
    public boolean[] visit;
    public int[] arr;
    public int sum;
    public int answer = 0;

    public int solution(int[] nums) {

        visit=new boolean[nums.length];
        arr = new int[3];
        dfs(0,nums,0);

        return answer;
    }

    public void dfs(int depth, int[] nums, int start) {
        if (depth == 3) {
            for (int val : arr) {
                sum += val;
            }
            System.out.println(sum);
            if (isPrime(sum)) {
                answer++;
            }

            sum = 0;
            return;
        }
        for (int i = start; i < visit.length; i++) {
            if (!visit[i]) {
                visit[i] = true;
                arr[depth] = nums[i];
                dfs(depth + 1, nums, i);
                visit[i] = false;
            }
        }
    }

    public boolean isPrime(int x) {
        if (x == 0 || x == 1) {
            return false;
        }
        for (int i = 2; i <= Math.sqrt(x); i++) {
            if (x % i == 0)
                return false;
        }
        return true;
    }
}
profile
Back-End Developer

0개의 댓글