๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“ฆ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/๐Ÿ—‚๏ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€์ด(Java)

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค/Java] k์ง„์ˆ˜์—์„œ ์†Œ์ˆ˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

by ์‚๋šค์˜ค๋ฆฌ 2025. 9. 15.

๋ฌธ์ œ ์„ค๋ช…

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

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก์˜ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr

์–‘์˜ ์ •์ˆ˜ n์ด ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. ์ด ์ˆซ์ž๋ฅผ k์ง„์ˆ˜๋กœ ๋ฐ”๊ฟจ์„ ๋•Œ, ๋ณ€ํ™˜๋œ ์ˆ˜ ์•ˆ์— ์•„๋ž˜ ์กฐ๊ฑด์— ๋งž๋Š” ์†Œ์ˆ˜(Prime number)๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€ ์•Œ์•„๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

  • 0P0์ฒ˜๋Ÿผ ์†Œ์ˆ˜ ์–‘์ชฝ์— 0์ด ์žˆ๋Š” ๊ฒฝ์šฐ
  • P0์ฒ˜๋Ÿผ ์†Œ์ˆ˜ ์˜ค๋ฅธ์ชฝ์—๋งŒ 0์ด ์žˆ๊ณ  ์™ผ์ชฝ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ฒฝ์šฐ
  • 0P์ฒ˜๋Ÿผ ์†Œ์ˆ˜ ์™ผ์ชฝ์—๋งŒ 0์ด ์žˆ๊ณ  ์˜ค๋ฅธ์ชฝ์—๋Š” ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ฒฝ์šฐ
  • P์ฒ˜๋Ÿผ ์†Œ์ˆ˜ ์–‘์ชฝ์— ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๊ฒฝ์šฐ
  • ๋‹จ, P๋Š” ๊ฐ ์ž๋ฆฟ์ˆ˜์— 0์„ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์†Œ์ˆ˜์ž…๋‹ˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, 101์€ P๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 437674์„ 3์ง„์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด 211020101011์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ์†Œ์ˆ˜๋Š” ์™ผ์ชฝ๋ถ€ํ„ฐ ์ˆœ์„œ๋Œ€๋กœ 211, 2, 11์ด ์žˆ์œผ๋ฉฐ, ์ด 3๊ฐœ์ž…๋‹ˆ๋‹ค. (211, 2, 11์„ k์ง„๋ฒ•์œผ๋กœ ๋ณด์•˜์„ ๋•Œ๊ฐ€ ์•„๋‹Œ, 10์ง„๋ฒ•์œผ๋กœ ๋ณด์•˜์„ ๋•Œ ์†Œ์ˆ˜์—ฌ์•ผ ํ•œ๋‹ค๋Š” ์ ์— ์ฃผ์˜ํ•ฉ๋‹ˆ๋‹ค.) 211์€ P0 ํ˜•ํƒœ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 2๋Š” 0P0์—์„œ, 11์€ 0P์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ •์ˆ˜ n๊ณผ k๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค. n์„ k์ง„์ˆ˜๋กœ ๋ฐ”๊ฟจ์„ ๋•Œ, ๋ณ€ํ™˜๋œ ์ˆ˜ ์•ˆ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„ ์กฐ๊ฑด์— ๋งž๋Š” ์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

์ œํ•œ ์‚ฌํ•ญ

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

์ž…์ถœ๋ ฅ ์˜ˆ

n k result
437674 3 3
110011 10 2

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

์ž…์ถœ๋ ฅ ์˜ˆ #1

  • ๋ฌธ์ œ์˜ ์˜ˆ์‹œ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ #2

  • 110011์„ 10์ง„์ˆ˜๋กœ ๋ฐ”๊พธ๋ฉด 110011์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์— ๋งž๋Š” ์†Œ์ˆ˜๋Š” 11, 11 2๊ฐœ์ž…๋‹ˆ๋‹ค.
    ์ด์™€ ๊ฐ™์ด ์ค‘๋ณต๋˜๋Š” ์†Œ์ˆ˜๋ฅผ ๋ฐœ๊ฒฌํ•˜๋”๋ผ๋„ ๋ชจ๋‘ ๋”ฐ๋กœ ์„ธ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ

import java.util.*;

class Solution {
    public int solution(int n, int k) {
        // ์†Œ์ˆ˜ ๊ฐœ์ˆ˜ ์ €์žฅํ•  ๋ณ€์ˆ˜ ์ƒ์„ฑ
        int answer = 0;
        
        // n์„ k์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜
        String baseK = Integer.toString(n, k);
        
        // '0'์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ๊ฐ„ ๋ถ„๋ฆฌ (์—ฐ์†๋œ 0๋„ ํ•œ ๋ฒˆ์— ๋Š๊ธฐ๋„๋ก "0+")
        String[] parts = baseK.split("0+");
        
        // ๊ฐ ๊ตฌ๊ฐ„์ด ์†Œ์ˆ˜์ธ์ง€ ํŒ๋ณ„
        for (String p : parts) {
            // ๋นˆ ๋ฌธ์ž์—ด ๋ฐฉ์–ด 
            if (p.isEmpty()) continue;
            
            // k <= 10์ด๋ฏ€๋กœ p๋Š” 0~9 ์ˆซ์ž๋งŒ. ๊ทธ๋Œ€๋กœ 10์ง„์ˆ˜๋กœ ํŒŒ์‹ฑ
            long num = Long.parseLong(p);
            
            if (isPrime(num)) {
                answer++;
            }
        }
        
        return answer;
    }
    
    // ์†Œ์ˆ˜ ํŒ๋ณ„: √n๊นŒ์ง€๋งŒ ํ™•์ธ
    private boolean isPrime(long x) {
        // 0, 1 ์ œ์™ธ
        if (x < 2) return false;
        // 2๋Š” ์†Œ์ˆ˜
        if (x == 2) return true;
        // ์ง์ˆ˜ ์ œ๊ฑฐ
        if (x % 2 == 0) return false;
        
        // √x ๊นŒ์ง€๋งŒ ๋‚˜๋ˆ„๊ธฐ
        long limit = (long) Math.sqrt(x);
        
        // ์ด๋ฏธ ์ง์ˆ˜๋Š” ์œ„์—์„œ ๊ฑธ๋ €์œผ๋ฏ€๋กœ ํ™€์ˆ˜๋งŒ ํ™•์ธ
        for (long l = 3; l <= limit; l += 2) {
            if (x % l == 0) return false;
        }
        
        return true;
    }
}

๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ•œ ๋ฐฉํ–ฅ

์ฒ˜์Œ ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ, ํ•ต์‹ฌ์€ ์ฃผ์–ด์ง„ ์ •์ˆ˜ n์„ k์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ํ•œ ๋’ค 0์„ ๊ธฐ์ค€์œผ๋กœ ์ž˜๋ผ ์ƒ๊ธด ์ˆ˜๋“ค ์ค‘ ์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ํŒŒ์•…ํ–ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ง„๋ฒ• ๋ณ€ํ™˜๊ณผ ์†Œ์ˆ˜ ํŒ๋ณ„ ๋‘ ๊ฐ€์ง€ ๊ณผ์ •์„ ์กฐํ•ฉํ•˜๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

์กฐ๊ฑด์„ ๋ถ„์„ํ•ด ๋ณด๋ฉด ๋จผ์ € n์„ k์ง„์ˆ˜๋กœ ๋ฐ”๊พธ๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ž๋ฐ”์—์„œ๋Š” Integer.toString(n, k)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์†์‰ฝ๊ฒŒ ๋ฌธ์ž์—ด ํ˜•ํƒœ์˜ k์ง„์ˆ˜๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋‹ค์Œ์—๋Š” 0์„ ๊ธฐ์ค€์œผ๋กœ ๋ฌธ์ž์—ด์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ด๋•Œ ๋‹จ์ˆœํžˆ split("0") ๋Œ€์‹  split("0+")๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ์†๋œ 0์„ ํ•œ ๋ฒˆ์— ์ž˜๋ผ๋‚ผ ์ˆ˜ ์žˆ์–ด ๋ถˆํ•„์š”ํ•œ ๋นˆ ๋ฌธ์ž์—ด์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜๋„ split ๊ฒฐ๊ณผ์—๋Š” ๋นˆ ๋ฌธ์ž์—ด์ด๋‚˜ 1 ๊ฐ™์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹Œ ๊ฐ’์ด ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ๋ฏธ๋ฆฌ ๊ฑธ๋Ÿฌ์ฃผ๋Š” ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

์†Œ์ˆ˜ ํŒ๋ณ„์€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์–ด๋–ค ์ˆ˜๊ฐ€ ์†Œ์ˆ˜์ธ์ง€ ํ™•์ธํ•˜๋ ค๋ฉด 2๋ถ€ํ„ฐ ์ž๊ธฐ ์ž์‹  ์ „๊นŒ์ง€ ๋ชจ๋“  ์ˆ˜๋กœ ๋‚˜๋ˆ ๋ด์•ผ ํ•˜์ง€๋งŒ, ์ด๋Š” ๋น„ํšจ์œจ์ ์ด๋‹ค. ๋”ฐ๋ผ์„œ √n๊นŒ์ง€๋งŒ ๊ฒ€์‚ฌํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ์„ฑ์งˆ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ๋จผ์ € 0๊ณผ 1์€ ์†Œ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ ์ œ์™ธํ•˜๊ณ , 2๋Š” ์œ ์ผํ•œ ์ง์ˆ˜ ์†Œ์ˆ˜์ด๋ฏ€๋กœ ๋ฐ”๋กœ ์†Œ์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๊ทธ ์™ธ ์ง์ˆ˜๋Š” ์ „๋ถ€ ํ•ฉ์„ฑ์ˆ˜์ด๋ฏ€๋กœ ๋น ๋ฅด๊ฒŒ ๊ฑฐ๋ฅด๊ณ , ํ™€์ˆ˜๋งŒ √n๊นŒ์ง€ ๊ฒ€์‚ฌํ•˜๋ฉด ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํฐ ์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ ์‹œ๊ฐ„ ๋‚ด์— ํŒ๋ณ„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด ๊ณผ์ •์„ ์ •๋ฆฌํ•˜๋ฉด, n์„ k์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ → 0์œผ๋กœ ๋ถ„๋ฆฌ → ์ˆซ์ž ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ 10์ง„์ˆ˜๋กœ ๋ณ€ํ™˜ → ์†Œ์ˆ˜ ํŒ๋ณ„ → ์นด์šดํŠธ๋ผ๋Š” ํ๋ฆ„์œผ๋กœ ํ’€์ด๋ฅผ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ๊ฐ ์กฐ๊ฐ์˜ ๊ธธ์ด์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€์ง€๋งŒ, ์†Œ์ˆ˜ ํŒ๋ณ„์„ √n๊นŒ์ง€๋งŒ ํ•˜๋ฏ€๋กœ ์ถฉ๋ถ„ํžˆ ํšจ์œจ์ ์ด๋‹ค.