[Java Algorithm] 프로그래머스 Lv.2_ 소수 찾기

2025. 7. 31. 20:55·Algorithm Study

[문제]

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.

제한사항
numbers는 길이 1 이상 7 이하인 문자열입니다.
numbers는 0~9까지 숫자만으로 이루어져 있습니다.
"013"은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.

 

[Algorithm]

처음에는 단순히 numbers 문자열의 문자들을 배열에 담고 그 배열의 조합들을 찾아내서 소수인지 판단하고 return하면 된다고 생각했다.

그런데 그러면 중복 제외 처리를 따로 해야하는 문제점이 발생..

그리고 배열의 조합을 어떤식으로 만들어야할지 감이 안왔다 -

 

그래서 결국 클로드와 구글 검색을 통해 공부함

 

1. 중복 방지를 위해 Set을 활용해 조합을 저장할 set 선언

2. 재귀함수를 이용해 순열 생성 → 모든 조합을 만들어 set에 저장

3. 에라토스테네스의 체를 이용해 소수 찾기

4. 개수 카운트해서 반환

 

[Code]

import java.util.*;

class Solution {
    // 중복 방지를 위한 set 선언
    Set<Integer> set = new HashSet<>();
    
    public int solution(String numbers){
    	permutation("", numbers);	// 숫자 조합을 만들어 set에 저장
        
        int count = 0;
        for(int num : set) {
        	if(isPrime(num)) count++;
        }
        
        return count;
    }
    
    // 재귀를 이용해 순열 생성
    public void permutation(String prefix, String str) {
    	if(!prefix.equals("")) {
        	set.add(Integer.parseInt(prefix)); //조합된 숫자를 set에 추가
        }
        
        for(int i=0; i < str.length(); i++){
        	//i번째 문자를 제외하고 다음 순열 생성
            permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1));
        }
    }
    
    // 소수 판별 함수
    public boolean isPrime(int n) {
        if (n < 2) return false;

        // 에라토스테네스 체
        for (int i = 2; i <= (int)Math.sqrt(n); i++) {
            if (n % i == 0) return false;
        }

        return true;    		
    }
}

 

[+ 다른 사람 풀이]

import java.util.HashSet;

class Solution {
    public int solution(String numbers) {
        HashSet<Integer> set = new HashSet<>();
        permutation("", numbers, set);
        int count = 0;
        while(set.iterator().hasNext()){
            int a = set.iterator().next();
            set.remove(a);
            if(a==2) count++;
            if(a%2!=0 && isPrime(a)){
                count++;
            }
        }        
        return count;
    }

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

    public void permutation(String prefix, String str, HashSet<Integer> set) {
        int n = str.length();

        if(!prefix.equals("")) set.add(Integer.valueOf(prefix));
        for (int i = 0; i < n; i++) permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), set);

    }

}

 

순열 함수가 기가 맥힌다는 댓글들이 백만개 ..

위 코드랑 다른 점은 set을 solution안에 선언해서 permutation 함수 사용시 set까지 매개변수로 넘겨준다

근데 이 문제에서는 어차피 set을 한 번만 쓸거라 굳이 이렇게 할 이유는 없을 것 같다 ..

 

또 여기서 궁금한 점.. 

왜 isPrime에서 i를 3부터 시작하고 굳이 while 문에서 2인 경우를 ++ 해주는걸까 ?

그냥 소수 판별 함수에서 2를 포함시켜도 되는 문제 아닌가 . . . 

반복문에서 짝수를 제외하고 도는게 훨씬 효율성이 높은건가?!

 

아시는 분 댓글점여..

저작자표시 변경금지 (새창열림)

'Algorithm Study' 카테고리의 다른 글

[Java Algorithm] 프로그래머스 Lv.2_ 피로도  (4) 2025.08.05
[Java Algorithm] 프로그래머스 Lv.2_ 카펫  (4) 2025.08.04
[Java Algorithm] 프로그래머스 Lv.1 _ 모의고사  (2) 2025.07.31
[Java Algorithm] 프로그래머스 Lv.1 _ 최소직사각형  (2) 2025.07.30
[Java Algorithm] 프로그래머스 Lv.2 _ H-Index  (2) 2025.07.30
'Algorithm Study' 카테고리의 다른 글
  • [Java Algorithm] 프로그래머스 Lv.2_ 피로도
  • [Java Algorithm] 프로그래머스 Lv.2_ 카펫
  • [Java Algorithm] 프로그래머스 Lv.1 _ 모의고사
  • [Java Algorithm] 프로그래머스 Lv.1 _ 최소직사각형
microsaurs
microsaurs
개발 스터디로그입니다. 공부한 내용을 정리해서 올립니다 ㅇ-ㅇ
  • microsaurs
    microsaurs.devlog
    microsaurs
  • 전체
    오늘
    어제
    • 분류 전체보기 (157)
      • Side Project (4)
      • Algorithm Study (53)
      • JAVA (8)
      • Swift (11)
      • Python (21)
      • CS (5)
      • React (3)
      • 리얼클래스 studylog (27)
      • 정보처리기사[실기] (23)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스위프트기초
    정보처리기사실기
    Java
    study
    프로그래머스
    알고리즘
    정처기실기
    The Office
    ios개발
    자바알고리즘
    파이썬문법
    더오피스
    영어독학
    정보처리기사프로그래밍언어
    Python
    프로그래밍언어
    javaalgorithm
    리얼학습일기
    리얼클래스
    정보처리기사
    Algorithm
    SWIFT
    javaStudy
    타일러영어
    ios프로그래밍
    나도코딩
    ios프로그래밍을위한스위프트기초
    파이썬
    파이썬기초
    영어회화
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
microsaurs
[Java Algorithm] 프로그래머스 Lv.2_ 소수 찾기
상단으로

티스토리툴바