본문 바로가기

코딩테스트/programmers

소수 찾기

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

흩어진 종이 조각들을 모두 사용하지 않은 경우도 소수인지 판별을 해야한다.

 

처음엔 흩어진 종이조각으로 만들 수 있는 가장 큰 수를 기준으로 모든 소수를 구해놓고 진행했는데 이러니 타임아웃이 생겼다.

 

결국 조합되는 수 각각 소수 여부를 판별하되, 소수 판별에는 해당 수의 제곱근까지의 수만 나눠보는 식으로 진행.

 

import java.util.*;

class Solution {
    boolean[] visited;
    Map<Integer, Boolean> cache = new HashMap();
    int answer = 0;
    public int solution(String numbers) {
        
        String[] split = numbers.split("");
        
        visited = new boolean[split.length];
        
        for (int i = 0; i < split.length; i++) {
            visited[i] = true;
            check(split, i, "");
            visited[i] = false;
        }
        
        return answer;
    }
    
    void check(String[] numbers, int idx, String composition) {
        
        composition += numbers[idx];
        
        int num = Integer.parseInt(composition);
        
        if (!cache.containsKey(num)) {
            boolean isPrime = isPrime(num);
            if (isPrime) answer++;
            
            cache.put(num, isPrime);
        }
        
        if (composition.length() == numbers.length) return;
        
        for (int i = 0; i < numbers.length; i++) {
            
            if (visited[i]) continue;
            
            visited[i] = true;
            check(numbers, i, composition);
            visited[i] = false;
            
        }
        
    }
    
    boolean isPrime(int num) {
        
        if (num < 2) return false;

        for (int i = 2; i <= Math.sqrt(num) + 1; i++) {
            if (i != num && num % i == 0) return false;
        }
        
        return true;
    }
}

'코딩테스트 > programmers' 카테고리의 다른 글

큰 수 만들기  (0) 2023.11.15
삼각 달팽이  (0) 2023.11.13
다리를 지나는 트럭  (0) 2023.11.09
가장 큰 수  (0) 2023.11.09
쿼드압축 후 개수 세기  (0) 2023.11.06