[프로그래머스] 42839 소수찾기 (Lv.2) - 완전 탐색

2024. 7. 14. 03:33·코딩 테스트/알고리즘

문제

코드

재귀를 이용하여 숫자 조합을 만들고 중복을 제거하기 위해 HashSet에 저장한다. 반복문을 이용하여 HashSet에 저장된 숫자의 소수 판별을 진행하고 소수의 개수를 반환한다.

  1. 재귀를 이용하여 숫자를 조합한다.
    • 중복을 피하기 위해 HashSet에 숫자를 저장한다.
  2. 소수를 판별하여 소수를 카운팅한다.
    • 이때 2 ~ target -1까지 모든 숫자를 확인할 필요 없이 제곱근까지만 확인하여 시간 복잡도를 줄인다.

예전에 풀었던 문제인데도 매우 어려웠다.. 결국 전에 작성한 코드를 참고해서 풀었다...ㅠㅠ

import java.util.*;

class Solution {
    HashSet<Integer> hs = new HashSet<>();
    public int solution(String numbers) {

        // 1. 재귀로 숫자를 조합한 후 HashSet에 삽입한다.
        combination("", numbers);

        // 2. hs에 있는 값 중 소수의 개수를 구한다.(소수 판별(제곱근까지만 확인))
        int cnt = 0;
        for (int num : hs) {
            if (prime(num)) {
                cnt++;
            }
        }
        return cnt;
    }

    public void combination(String target, String arr) {
        if (!target.equals("")) 
        // Integer.valueOf()를 통해 맨 앞에 0이 온다면 무시(011, 11 -> 모두 11로 변환)
            hs.add(Integer.valueOf(target)); 

        for (int i = 0; i < arr.length(); i++) 
            combination(target + arr.charAt(i), arr.substring(0, i) + arr.substring(i + 1));
    }

    // 
    public boolean prime(int target) {
        if (target == 0 || target == 1) {
            return false;
        }
        // 2 ~ target-1까지 모두 판별할 필요 없이 제곱근까지만 확인해도 소수 판별 가능
        for(int i = 2 ; i <= Math.sqrt(target); i++){
            if(target % i == 0 ) { // 소수가 아님
                return false;
            }
        }
        return true;
    }
}

헷갈린 부분

combination()에 arr값을 인자로 넣을 때 arr에arrValue를 빼야 한다. replace() 함수를 사용하여arrValue 값을 공백으로 대체하는 방법을 사용했다. 그런데 이 경우 arrValue가 arr에서 중복되는 값일 경우 문제가 발생한다. 예를 들어 arr = "110"이고 arrValue가 '1'이라면 오류가 발생한다.

public void combination(String target, String arr) {
        if (!target.equals("")) 
        // Integer.valueOf()를 통해 맨 앞에 0이 온다면 무시(011, 11 -> 모두 11로 변환)
            hs.add(Integer.valueOf(target));

        /** 아래 코드는 중복된 숫자가 있을 경우 오류 발생
        ex. arr가 "110"이고 arrValue가 '1'일 때 앞에 1과 뒤 1중 뭘 ""로 대체할지 알 수 없음*/
        for (char arrValue : arr.toCharArray()) {
            combination(target + arrValue, arr.replace(String.valueOf(arrValue), ""));
        }
    }

위 문제를 해결하기 위해 arr.charAt(i) 값을 제외한 나머지 값만 잘라서 arr 인자로 넣는 방법을 사용했다. 처음 ~ arr.charAt(i)-1 + arr.charAt(i)+1 ~ 마지막까지의 값을 arr 인자로 넣는 방식으로 오류를 해결했다.

public void combination(String target, String arr) {
        if (!target.equals("")) 
        // Integer.valueOf()를 통해 맨 앞에 0이 온다면 무시(011, 11 -> 모두 11로 변환)
            hs.add(Integer.valueOf(target));

        /** 아래 코드는 중복된 숫자가 있을 경우 오류 발생
        ex. arr가 "110"이고 arrValue가 '1'일 때 앞에 1과 뒤 1중 뭘 ""로 대체할지 알 수 없음*/

        for (int i = 0; i < arr.length(); i++) 
            combination(target + arr.charAt(i), arr.substring(0, i) + arr.substring(i + 1));
    }

![[Pasted image 20240714031452.png]]

추가적으로 공부가 필요한 부분

  • 소수 찾기
  • 에라토스테네스의 체

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

[프로그래머스] 84512 모음사전(Lv.2) - 완전 탐색(dfs, 재귀)  (0) 2024.07.17
[프로그래머스] 87946 피로도(Lv.2) - 순열(visited 배열 방식 , 재귀, DFS)  (0) 2024.07.15
[프로그래머스] 42840 모의고사 (Lv.1) - 완전 탐색(브루트 포스)  (1) 2024.07.14
[프로그래머스] 86491 최소직사각형 (Lv.1) - 완전 탐색  (0) 2024.07.13
[백준] 24061 알고리즘 수업 - 병합 정렬 2  (0) 2024.07.11
'코딩 테스트/알고리즘' 카테고리의 다른 글
  • [프로그래머스] 84512 모음사전(Lv.2) - 완전 탐색(dfs, 재귀)
  • [프로그래머스] 87946 피로도(Lv.2) - 순열(visited 배열 방식 , 재귀, DFS)
  • [프로그래머스] 42840 모의고사 (Lv.1) - 완전 탐색(브루트 포스)
  • [프로그래머스] 86491 최소직사각형 (Lv.1) - 완전 탐색
토자맨
토자맨
  • 토자맨
    개발하는 토자맨
    토자맨
  • 전체
    오늘
    어제
    • 개발 공부
      • 코딩 테스트
        • 코드업 기초 100제
        • 백준
        • 99클럽
        • 자료구조
        • 알고리즘
      • Programming Language
        • 자바(JAVA)
      • Back-end
        • Spring
      • Front-end
        • html
        • css
      • DevOps
        • AWS
        • CI CD
        • Docker
        • 홈서버
        • Git
      • Computer Science
        • 자료구조
        • 알고리즘
        • 운영체제
        • OS,Network,DB,DesignPattern
      • 프로젝트
        • 웨이트 쇼핑몰
      • 공부 로드맵
        • 2학년 겨울방학
        • 3학년 2학기
        • 3학년 겨울방학
      • 일상
        • 기타 정보
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    bfs #최단거리탐색 #프로그래머스
    dfs #백준
    스프링 #spring #스프링 컨테이너 #스프링 컨텍스트
    백준 #dfs
    99클럽 #코딩테스트 준비 #개발자 취업 #항해99 #til
    bfs #프로그래머스
    오블완
    백준 #dfs #알고리즘
    nvidia-docker #docker cuda #docker gpu #엔비디아 도커
    dp #백준 #동적계획법
    싱글톤 패턴 #싱글톤 컨테이너 #싱글톤 레지스트리 #싱글톤 객체 상태 #무상태 #stateless #유지상태 #staleful
    백준 #dfs #11725번
    이진탐색 #이분탐색 #백준
    스프링핵심원리 #김영한 #의존관계자동주입 #의존관계 자동 주입
    프로그래머스 #dfs
    티스토리챌린지
    피보나치 수 #백준 #dp
    bfs #백준
    ec2 멈춤 #ec2 터짐 #ec2 ssh 연결 끊김 #ec2 끊김
    git filter-repo
    solid #객체지향설계원칙
    프로그래머스 #dp
    git filter-branch #commit 수정 #commit
    dfs #알고리즘
    이진탐색 #이분탐색 #알고리즘
    백준 #아기상어2 #bfs
    백준 #이진탐색 #이분탐색
    nvidia container toolkit #
    백준 #bfs
    백준 #dp #동적계획법
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
토자맨
[프로그래머스] 42839 소수찾기 (Lv.2) - 완전 탐색
상단으로

티스토리툴바