프로그래머스 소수찾기 자바

꾸준하게 달리기~·2023년 9월 5일
0
post-thumbnail

문제는 다음과 같다.
https://school.programmers.co.kr/learn/courses/30/lessons/42839


풀이는 다음과 같다.

import java.util.*;

class Solution {
    static HashSet<Integer> set = new HashSet<>();
    static boolean[] visited;
    public int solution(String numbers) {
        char[] nums = numbers.toCharArray();
        
        
        visited = new boolean[nums.length];
        
        backTracking(0, nums, 0);
        
        int answer = 0;
        
        for(int s : set) {
            if(isPrime(s)) answer++;
        }
        
        return answer;
    }
    
    
    
    
    static void backTracking(int depth, char[] nums, int now) {
        
        if(depth == nums.length) {
            set.add(now);
            return;
        }
        
        
        if(now > 1) {
            set.add(now);
        }
        
        
        for(int i = 0 ; i < nums.length ; i++) {
            if(visited[i]) continue;
            
            visited[i] = true;
            int next =  (now * 10) + (nums[i] - '0');
            backTracking(depth+1, nums, next);
            visited[i] = false;
        }
    }
    
    
    
    
    static boolean isPrime(int a) {
        if(a == 0 || a == 1) return false;
        for(int i = 2 ; i <= (int) Math.sqrt(a) ; i++) {
            if(a % i == 0) return false;
        } 
        return true;
    }
}




풀이는 다음과 같이 했다.

  • backTracking 함수를 통해 주어진 숫자들을 방문하며 모든 경우의 수를 HashSet<Integer> set에 넣어주었다.

  • 해당 set를 순회하며 나오는 해당 숫자를 isPrime 함수를 통해
    소수 여부를 판별 후 answer 숫자값을 늘려준다.


유의해야 할 점

now * 10 + (nums[i] - '0')
을 통해 다음 숫자로 넘어가는 부분이 중요하다.

예를 들어 String 형태이면, substring, += 를 사용해서
새로운 String을 만들고 원상복구해야하지만,

위와 같이 int형으로
now * 10 + (nums[i] - '0') 를 사용하면 이전 단계로 돌아갈 때
곧바로 이전 값을 얻어낼 수 있고 원상복구 할 필요 없다.

profile
반갑습니다~! 좋은하루 보내세요 :)

0개의 댓글