λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
TIL

[μ½”ν…Œμ—°μŠ΅] kμ§„μˆ˜μ—μ„œ μ†Œμˆ˜ 개수 κ΅¬ν•˜κΈ°

by 크라00 2025. 2. 24.

https://school.programmers.co.kr/learn/courses/30/lessons/92335?language=java

πŸ”Ή kμ§„μˆ˜μ—μ„œ μ†Œμˆ˜ 개수 κ΅¬ν•˜κΈ° 문제 뢄석 및 풀이

πŸ“Œ 문제 κ°œμš”
β€’ μžμ—°μˆ˜ n을 kμ§„μˆ˜λ‘œ λ³€ν™˜ν•œ ν›„, μˆ«μžλ“€μ„ 0을 κΈ°μ€€μœΌλ‘œ λ‚˜λˆˆλ‹€.
β€’ λ‚˜λˆ μ§„ μˆ«μžλ“€ μ€‘μ—μ„œ μ†Œμˆ˜μ˜ 개수λ₯Ό κ΅¬ν•˜λŠ” 문제.

πŸ“Œ 문제 νƒ€μž…
β€’ λ¬Έμžμ—΄ 처리
β€’ 진법 λ³€ν™˜
β€’ μ†Œμˆ˜ νŒλ³„
β€’ μˆ˜ν•™μ  계산

πŸ“Œ 문제 뢄석
1. n을 kμ§„λ²•μœΌλ‘œ λ³€ν™˜ν•΄μ•Ό ν•œλ‹€.
2. λ³€ν™˜λœ kμ§„μˆ˜μ—μ„œ 0을 κΈ°μ€€μœΌλ‘œ μˆ«μžλ“€μ„ λΆ„λ¦¬ν•œλ‹€.
3. λΆ„λ¦¬λœ μˆ«μžλ“€μ΄ μ†Œμˆ˜μΈμ§€ νŒλ³„ν•΄μ•Ό ν•œλ‹€.
4. μ†Œμˆ˜ 개수λ₯Ό μΉ΄μš΄νŠΈν•˜μ—¬ λ°˜ν™˜ν•œλ‹€.

πŸ“Œ 문제 풀이 (Bullet Point)

1. n을 kμ§„μˆ˜λ‘œ λ³€ν™˜
β€’ Long.toString(n, k)λ₯Ό μ‚¬μš©ν•˜μ—¬ kμ§„λ²•μœΌλ‘œ λ³€ν™˜.
β€’ μ˜ˆμ‹œ: n = 437674, k = 3 β†’ 211020101011

2. 0을 κΈ°μ€€μœΌλ‘œ 숫자λ₯Ό 뢄리
β€’ split("0")을 μ‚¬μš©ν•˜μ—¬ 0을 κΈ°μ€€μœΌλ‘œ λ‚˜λˆ”.
β€’ μ˜ˆμ‹œ: "211020101011" β†’ ["211", "2", "1", "101", "11"]
β€’ 빈 λ¬Έμžμ—΄("")이 λ‚˜μ˜¬ μˆ˜λ„ μžˆμœΌλ―€λ‘œ 처리 ν•„μš”.

3. 각 숫자λ₯Ό μ†Œμˆ˜ νŒλ³„
β€’ 1은 μ†Œμˆ˜κ°€ μ•„λ‹˜ β†’ μ˜ˆμ™Έ 처리.
β€’ μ†Œμˆ˜ νŒλ³„μ€ Math.sqrt(num)κΉŒμ§€ λ°˜λ³΅λ¬Έμ„ 돌며 확인.

4. μ†Œμˆ˜ 개수 카운트 ν›„ λ°˜ν™˜
β€’ μ†Œμˆ˜μΈ 경우 개수λ₯Ό μ¦κ°€μ‹œν‚€κ³  μ΅œμ’…μ μœΌλ‘œ λ°˜ν™˜.

πŸ“Œ μ‹œκ°„ λ³΅μž‘λ„ 뢄석
β€’ 진법 λ³€ν™˜: O(log n)
β€’ λ¬Έμžμ—΄ 뢄리: O(n)
β€’ μ†Œμˆ˜ νŒλ³„: ν‰κ· μ μœΌλ‘œ O(√m) (m은 λ³€ν™˜λœ 숫자의 크기)
β€’ 전체 λ³΅μž‘λ„: O(n log n) μ •λ„λ‘œ λ³Ό 수 있음. (μ΅œμ•…μ˜ 경우)

πŸ“Œ 예제

μž…λ ₯

n = 437674, k = 3

λ³€ν™˜λœ kμ§„μˆ˜

"211020101011"

λΆ„λ¦¬λœ 숫자

["211", "2", "1", "101", "11"]

μ†Œμˆ˜ νŒλ³„

211 (μ†Œμˆ˜) βœ…
2 (μ†Œμˆ˜) βœ…
1 (μ†Œμˆ˜ μ•„λ‹˜) ❌
101 (μ†Œμˆ˜) βœ…
11 (μ†Œμˆ˜) βœ…

좜λ ₯

4

βœ” μ΅œμ’…μ μœΌλ‘œ μ†Œμˆ˜ κ°œμˆ˜λŠ” 4!


Java

class Solution {
    public int solution(int n, int k) {
        int answer = 0;
        
        // μ£Όμ–΄μ§„ 숫자 n을 kμ§„λ²•μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ λ¬Έμžμ—΄λ‘œ μ €μž₯
        String x = Long.toString(n, k);
        
        // λ³€ν™˜λœ 숫자λ₯Ό '0'을 κΈ°μ€€μœΌλ‘œ λΆ„ν• ν•˜μ—¬ λ°°μ—΄λ‘œ μ €μž₯
        String[] arr = x.split("0");
        
        // 배열을 μˆœνšŒν•˜λ©΄μ„œ μ†Œμˆ˜μΈ 경우 answer 증가
        for (String str : arr) {
            if (str.isEmpty()) continue; // 빈 λ¬Έμžμ—΄μ΄λ©΄ κ±΄λ„ˆλœ€
            
            // λ¬Έμžμ—΄μ„ 숫자둜 λ³€ν™˜ν•œ ν›„ μ†Œμˆ˜ νŒλ³„
            if (isPrime(Long.parseLong(str))) {
                answer += 1; // μ†Œμˆ˜μΌ 경우 개수 증가
            }
        }
        
        return answer; // μ΅œμ’… μ†Œμˆ˜ 개수 λ°˜ν™˜
    }
    
    // μ†Œμˆ˜ νŒλ³„ ν•¨μˆ˜
    static boolean isPrime(long num) {
        if (num == 1) return false; // 1은 μ†Œμˆ˜κ°€ μ•„λ‹˜
        
        // 2λΆ€ν„° √numκΉŒμ§€ λ‚˜λˆ μ„œ λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λ©΄ μ†Œμˆ˜κ°€ μ•„λ‹˜
        for (int i = 2; i <= (int) Math.sqrt(num); i++) {
            if (num % i == 0) {
                return false; // λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λ©΄ μ†Œμˆ˜κ°€ μ•„λ‹˜
            }
        }
        return true; // λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” μˆ˜κ°€ μ—†μœΌλ©΄ μ†Œμˆ˜
    }
}