minzee
개발 기록장
minzee
전체 방문자
오늘
어제
  • 분류 전체보기 (95)
    • 프로젝트 (1)
      • CheriC 체리시 (1)
      • Collec 콜렉 (0)
      • Homemaster 홈마스터 (0)
    • 회고록 (0)
    • CS 공부 (5)
    • 개발 공부 (27)
      • Modern JS Deep Dive (5)
      • JavaScript & TypeScript (3)
      • Next.js (1)
      • React (0)
      • React-Native (0)
      • HTML & CSS (7)
      • Linux (2)
      • Git & GitHub (1)
      • Kotlin (2)
      • Python (3)
      • C++ (2)
    • 코테 공부 (44)
      • BOJ (33)
      • Computer Algorithm (10)
      • Data Structures (1)
    • 활동 (15)
      • 우아한테크코스 7기 FE 프리코스 (4)
      • 원티드 프리온보딩 FE 챌린지 (1)
      • 위니브 엠버서더 3기 (10)
    • 학교 (3)

블로그 메뉴

  • Github
  • Naver Blog
  • Instagram
hELLO · Designed By 정상우.
minzee

개발 기록장

[프로그래머스] 소수 찾기 - 완전탐색 (JS)
코테 공부/Computer Algorithm

[프로그래머스] 소수 찾기 - 완전탐색 (JS)

2025. 4. 8. 01:24

프로그래머스 알고리즘 고득점 kit - 완전 탐색(=brute force) 문제

문제

처음 접근 시도

// 1) split로 numbers을 배열 만들기
// 2) numbers로 만들 수 있는 모든 숫자 구하는 로직
//      2.1) 맨앞이 0인 경우 제외 -> continue 사용 
//      2.2) 1도 제외
//      2.3) numbers.length만큼 반복 (한 자리 수, 두 자리 수...)
// 3) 소수인지 판별하는 로직
//      3.1) 2부터 9까지 나눠서 나머지가 1이상 나오는 경우 -> 소수

function solution(numbers) {
    var answer = 0;
    numbers = numbers.split('');
    console.log(numbers.length);
    for (int i = 1; i <= numbers.length; i*10){
       
    }
    return answer;
}

나름 처음부터 설계 고민하고 풀려고 하다가 숫자를 만들 수 있는 모든 경우의 수를 구하는 방법에서 막혔다. 그래서 나름 패턴을 찾아보려고 직접 숫자가 2개,3개,4개 인 경우를 계산해봤는데…쉽지 않았다

 

그래서 풀이를 보니 Set()를 사용하면 된다고 한다

 

그리고 parseInt를 쓰면 앞에 0인 경우를 없애준다고도 알게되었다. 원래는 if문으로 첫자리가 0이면 continue해서 넘기려했는데 이렇게 손쉬운 방법이…

풀이

function solution(numbers) {
    // 1. 문자열을 배열로 분리
    let digits = numbers.split('');
    let uniqueNumbers = new Set();
    
    // 2. 재귀 함수를 이용해 가능한 모든 순열(숫자 조합) 생성
    function generatePermutation(current, remaining) {
        if (current !== "") {
            uniqueNumbers.add(parseInt(current)); // parseInt가 앞의 0을 제거해줌
        }
        for (let i = 0; i < remaining.length; i++) {
            // 남은 숫자 중 하나를 선택해 current에 추가하고, 나머지 배열로 재귀 호출
            generatePermutation(current + remaining[i], remaining.slice(0, i).concat(remaining.slice(i + 1)));
        }
    }
    
    generatePermutation("", digits);
    
    // 3. 소수 판별 함수
    function isPrime(n) {
        if (n < 2) return false; // 0과 1은 소수가 아님
        for (let i = 2; i <= Math.sqrt(n); i++) {
            if (n % i === 0) return false;
        }
        return true;
    }
    
    // 4. 고유 숫자들 중 소수 개수를 계산
    let count = 0;
    uniqueNumbers.forEach(num => {
        if (isPrime(num)) count++;
    });
    
    return count;
}

 

숫자 조각 분리

  • 주어진 문자열을 split('')을 사용해 개별 숫자(문자) 배열로 만들기

모든 숫자 조합(순열) 생성

  • 재귀 함수를 이용해 한 자리, 두 자리, ... 최대 전체 길이의 모든 순열 만들기
    • 현재 조합이 빈 문자열이 아닐 때마다 정수로 변환하여 Set에 추가하면, 중복된 숫자는 자동으로 걸러짐
    • 문자열 앞에 '0'이 붙은 경우라도 parseInt를 사용하면 자동으로 제거되므로(예: "011" → 11), 별도의 처리가 필요 X

소수 판별

  • 생성된 각 숫자에 대해 2 이상의 수부터 √n까지 나누어 떨어지는지 확인하는 소수 판별 함수를 구현합니다.
    • 0과 1은 소수가 아니므로 판별 과정에서 제외

소수 개수 반환

  • Set에 저장된 고유 숫자들 중 소수에 해당하는 숫자의 개수를 계산하여 반환

배운점

- 재귀함수 사용하기

: 재귀함수라는게 뭔지는 알고 있었지만 이걸 이 문제에 이용할 생각을 못했었다. 재귀 함수를 이용하면 코드가 더 단순해지고 가독성이 좋아질 수 있다.

 

- Set()

: 중복되지 않는 유일한 값들만 저장할 수 있는 컬렉션이다. 즉 배열과는 달리 같은 값을 넣어도 한 번만 저장되기에, 데이터가 중복되는것을 맊을 수 있다. 그리고 삽입된 순서도 유지하기에 for문과 같은 반복문을 통해 순서대로 값을 사용할 수 있다.

 

- parseInt()

: 문자열 숫자를 정수로 변환해준다. 즉, 만약 숫자 앞에 0이 있으면 제거해준다 ex) "011" -> 11

저작자표시 (새창열림)

'코테 공부 > Computer Algorithm' 카테고리의 다른 글

[프로그래머스] 카펫 - 완전탐색 (JS)  (0) 2025.04.10
[2024 알고리즘 특강] 공항 방문수 (파이썬)  (0) 2024.05.16
[2024 알고리즘 특강] 가장 긴 팰린드롬 - 프로그래머스 (파이썬)  (0) 2024.05.16
[2024 알고리즘 특강] 문자열/회문 (파이썬)  (0) 2024.05.16
[이코테] 두 배열의 원소 교체 (파이썬)  (0) 2024.04.05
    '코테 공부/Computer Algorithm' 카테고리의 다른 글
    • [프로그래머스] 카펫 - 완전탐색 (JS)
    • [2024 알고리즘 특강] 공항 방문수 (파이썬)
    • [2024 알고리즘 특강] 가장 긴 팰린드롬 - 프로그래머스 (파이썬)
    • [2024 알고리즘 특강] 문자열/회문 (파이썬)
    minzee
    minzee
    🇩🇮🇬🇮🇹🇦🇱 🇲🇪🇩🇮🇦 & 🇸🇴🇫🇹🇼🇦🇷🇪 🇨🇴🇳🇻🇪🇷🇬🇪🇳🇨🇪

    티스토리툴바