[프로그래머스/Java] k진수에서 소수 개수 구하기

2025. 5. 29. 22:13·Problem Solving/프로그래머스

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

양의 정수 `n`을 `k`진수의 숫자로 변환했을 때, 그 수 안에 있는 소수의 개수를 구하려고 한다.

아래 조건에 맞는 경우에만 소수로 판단한다.

  • `0P0`처럼 소수 양쪽에 0이 있는 경우
  • `P0`처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
  • `0P`처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
  • `P`처럼 소수 양쪽에 아무것도 없는 경우
  • 단, `P`는 각 자릿수에 0을 포함하지 않는 소수입니다.
    • 예를 들어, 101은 `P`가 될 수 없습니다.

`n`과 `k`의 범위는 다음과 같다.

  • 1 ≤ `n` ≤ 1,000,000
  • 3 ≤ `k` ≤ 10

 

풀이

처음 봤을 땐 조건이 많아서 고민을 했었는데, 문자열을 투 포인터로 돌면서 소수를 판별해주고자 했다.

그래서 투 포인터를 사용해서 코드를 구현하고자 했으나, 구현할 방법이 떠오르지 않아 구현 방법을 검색해서 풀었다.

 

조건을 차근차근 해석해 보면, 0을 단위로 끊어서 소수를 판별해야 한다는 것을 알 수 있다. 심지어 자릿수의 맨 앞, 맨 뒤가 아닌 중간에 0이 포함된 소수는 소수로 판별하지 않는다. 그래서 투 포인터로 굳이 구하지 않아도 0을 단위로 끊어서 소수를 판별해주기만해도 쉽게 구해줄 수 있다.

 

코드

투 포인터를 사용한 방식이다.

import java.util.*;

class Solution {
    public int solution(int n, int k) {
        String[] targets = getNBasedNumber(n, k).split("0");
        int count = 0;
        int start = 0;
        for (int end = 0; end <= nBasedNum.length(); end++) {
            // 구간 끝이거나 0을 만나면 토큰 완성
            if (end == nBasedNum.length() || nBasedNum.charAt(end) == '0') {
                if (start < end) {
                    String token = nBasedNum.substring(start, end);
                    if (!token.contains("0") && isPrime(Long.parseLong(token))) {
                        count++;
                    }
                }
                start = end + 1; // 다음 구간 시작
            }
        }

        return count;
    }

    public String getNBasedNumber(int num, int base) {
        StringBuilder sb = new StringBuilder();
        while (num > 0) {
            sb.append(num % base);
            num /= base;
        }
        return sb.reverse().toString();
    }

    public boolean isPrime(long num) {
        if (num < 2) return false;
        for (long i = 2; i <= (long) Math.sqrt(num); i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
}

 

0 단위로 Tokenizing해서 푼 코드다.

import java.util.*;

class Solution {
    public int solution(int n, int k) {
        String[] targets = getNBasedNumber(n, k).split("0");
        int count = 0;
        for (String num : targets) {
            if (num.equals("")) continue;
            if (isPrime(Long.parseLong(num))) {
                count++;
            }
        }

        return count;
    }

    public String getNBasedNumber(int num, int base) {
        StringBuilder sb = new StringBuilder();
        while (num > 0) {
            sb.append(num % base);
            num /= base;
        }
        return sb.reverse().toString();
    }

    public boolean isPrime(long num) {
        if (num < 2) return false;
        for (long i = 2; i <= (long) Math.sqrt(num); i++) {
            if (num % i == 0) return false;
        }
        return true;
    }
}
저작자표시 비영리 동일조건 (새창열림)

'Problem Solving > 프로그래머스' 카테고리의 다른 글

[프로그래머스/Java] 다트 게임  (2) 2025.05.30
[프로그래머스/Java] 압축  (0) 2025.05.30
[프로그래머스/Java] 실패율  (2) 2025.05.28
[프로그래머스/Java] N진수 게임 (feat. Java 진법 변환)  (1) 2025.05.23
[프로그래머스/Java] 뉴스 클러스터링  (1) 2025.05.22
'Problem Solving/프로그래머스' 카테고리의 다른 글
  • [프로그래머스/Java] 다트 게임
  • [프로그래머스/Java] 압축
  • [프로그래머스/Java] 실패율
  • [프로그래머스/Java] N진수 게임 (feat. Java 진법 변환)
friend5hip
friend5hip
개발 관련 지식이나 기록을 남기고 있습니다.
  • friend5hip
    friend5hip
    friend5hip
  • 전체
    오늘
    어제
    • 분류 전체보기 (60)
      • 컴퓨터공학 (2)
        • 자료구조 (0)
        • 알고리즘 (1)
        • 데이터베이스 (1)
      • Problem Solving (42)
        • BOJ (25)
        • 프로그래머스 (15)
      • 언어 (2)
        • JavaScript (2)
      • 라이브러리 (12)
        • React (12)
      • 개발 (2)
      • 기타 (0)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

    BFS
    구현
    집합
    매개 변수 탐색
    dfs
    누적 합
    react
    투 포인터
    수학
    완전 탐색
    맵
    java
    프로그래머스
    문자열
    소수 판별
    정렬
    vite
    백트래킹
    이분 탐색
    dp
    코드트리
    구간 합
    JavaScript
    시뮬레이션
    N과 M
    intersection observer
    순열
    삼성 sw 역량테스트
    백준
    그리디
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
friend5hip
[프로그래머스/Java] k진수에서 소수 개수 구하기
상단으로

티스토리툴바