๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

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

 

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

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr


1. ๋ฌธ์ œ

์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ฐ ์ž๋ฆฌ๋ฅผ ์กฐํ•ฉํ•˜์—ฌ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์†Œ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

2. ํ’€์ด

๋ถ€๋ถ„์ง‘ํ•ฉ + ์ˆœ์—ด + ์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ ๋กœ ํ’€์—ˆ๋‹ค.

์ค‘๋ณต์ฒดํฌ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด HashMap 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

1. ๋ฌธ์ž์—ด์˜ ๊ฐ ์ž๋ฆฌ๋ฅผ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ์กฐํ•ฉํ•œ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด์—์„œ (HashMap์œผ๋กœ ์ค‘๋ณต์ฒดํฌ1)

2. ๊ฐ ์ž๋ฆฌ๋ฅผ ์ˆœ์—ด๋กœ ๋ฐฐ์น˜ํ•˜์˜€๊ณ  (HashMap์œผ๋กœ ์ค‘๋ณต์ฒดํฌ2)

3. ์ตœ์ข…์ ์œผ๋กœ ๋‚จ์€ ๋ฌธ์ž์—ด์€ ์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ ํ›„ true/false๋ฅผ ๋ฆฌํ„ดํ•˜์˜€๋‹ค.

     => true๋ฉด ans๊ฐ’์„ 1 ๋Š˜๋ ค์ค€๋‹ค.

 

3. ์ฝ”๋“œ

import java.io.*;
import java.util.*;

class Solution {
    
    static int ans, length;
    static int[] tgt;
    static Map<String, String> map, map2;
    
    public int solution(String numbers) {
        map = new HashMap<> ();
        map2 = new HashMap<> ();
        //๋ถ€๋ถ„์ง‘ํ•ฉ
        length = numbers.length();
        for (int i=1; i< (1<<length); i++) {
            StringBuilder sb = new StringBuilder();
            
            for (int j=0; j<length; j++) {
                if ((i & (1<<j)) != 0) {
                    sb.append(numbers.charAt(j));
                }
            }
            //์ˆœ์—ด
            if (map.containsKey(sb.toString())) continue;
            map.put(sb.toString(), "1");
            tgt = new int[sb.toString().length()];
            perm(sb.toString(), 0, 0);
        }
        return ans;
    }
    
    static void perm(String num, int tgtIdx, int flag) {
        if (tgtIdx == num.length()) {
            if (find(num, tgt)) { ans++; }
            return;
        }
        for (int i=0; i<num.length(); i++) {
            if ((flag & (1<<i)) != 0) continue;
            tgt[tgtIdx] = i;
            perm(num, tgtIdx+1, flag|(1<<i));
        }
    }
    
    static Boolean find(String num, int[] tgt) {
        StringBuilder sb = new StringBuilder();
        
        for (int idx:tgt) {
            sb.append(num.charAt(idx));
        }
        if (sb.toString().charAt(0) == '0') return false;
        if (map2.containsKey(sb.toString())) return false;
        map2.put(sb.toString(), "1");
        
        int newNum = Integer.parseInt(sb.toString());
        //์†Œ์ˆ˜์ฐพ๊ธฐ
        if (newNum == 1) return false;
        for (int i=2; i<= Math.sqrt(newNum); i++) {
            if (newNum % i == 0) {
                return false;
            }
        }
        return true;
    }
}

 

4. ์‚ฌ๋‹ด

๋ถ€๋ถ„์ง‘ํ•ฉ, ์ˆœ์—ด์„ ๋น„ํŠธ๋งˆ์Šคํ‚น์œผ๋กœ ํ‘ธ๋‹ˆ๊นŒ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ณ  ์ข‹์€ ๊ฒƒ ๊ฐ™๋‹ค.

์†Œ์ˆ˜๊ตฌํ•˜๊ธฐ๋„ ์•”๊ธฐํ•˜๋‹ˆ๊นŒ ์š”๊ธดํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.

๋””๋ฒ„๊น…ํ•˜๋ฉด์„œ ๋‚˜์˜ฌ๋“ฏ ๋ง๋“ฏ ํ•˜๋‹ค๊ฐ€ ๋‚˜์˜ค๋Š” ๊ทธ ์งœ๋ฆฟํ•จ.. 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์กด์žผ์ธ๋“ฏ