๐ 1. ๋ฌธ์ ์ค๋ช
์
์ถ๋ ฅ ์ ์ค๋ช
์์ #1
[1, 7]์ผ๋ก๋ ์์ [7, 17, 71]๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
์์ #2
[0, 1, 1]์ผ๋ก๋ ์์ [11, 101]๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
11๊ณผ 011์ ๊ฐ์ ์ซ์๋ก ์ทจ๊ธํฉ๋๋ค.
๐ก 2. ์ ๊ทผ๋ฐฉ์
(1) ์์ ํ๋ณํ๋ ๋ฉ์๋ isPrime ๋ง๋ค๊ธฐ
public static boolean isPrime(int num) {
if (num < 2) return false; // 2 ๋ฏธ๋ง์ ์์๊ฐ ์๋
for (int i = 2; i <= Math.sqrt(num); i++) { // 2๋ถํฐ √num๊น์ง ํ์ธ
if (num % i == 0) return false; // ๋๋ ๋จ์ด์ง๋ฉด ์์๊ฐ ์๋
}
return true; // ๋๋ ๋จ์ด์ง์ง ์์ผ๋ฉด ์์
}
Math.sqrt()
์ฃผ์ด์ง ํจ์๋ก ์ ๊ณฑ๊ทผ ๋ง๋๋ ๋ฉ์๋
Square root๋ฅผ ์ค์ฌ์ sqrt
์์์ธ์ง ํ๋ณํ๋ ๋ฐฉ์ : ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
(2) ์์ด ์์ฑํ๋ ๋ฉ์๋ generatePeremutations ๋ง๋ค๊ธฐ
// ์์ด์ ์์ฑํ๋ ์ฌ๊ท ๋ฉ์๋
public void generatePermutations(String prefix, String str) {
if (!prefix.isEmpty()) {
numSet.add(Integer.parseInt(prefix)); // ํ์ฌ ๊ฐ์ ์ซ์๋ก ๋ณํํ์ฌ Set์ ์ถ๊ฐ
}
for (int i = 0; i < str.length(); i++) { //
generatePermutations(prefix + str.charAt(i),
str.substring(0, i) + str.substring(i + 1));
}
}
์์ด์ด๋๊น Permutations๋ผ๊ณ ํ๋ค. ์กฐํฉ(Combinatoin)์ ์์๊ฐ ์ค์ํ์ง ์์ ๋ ์ฐ๋ ๊ฒ์ด๊ณ ์ฌ๊ธฐ์๋ ์ฃผ์ด์ง ์ซ์๋ค์ ๋ชจ๋ ๊ฐ๋ฅํ ์์๋ก ์ฌ๋ฐฐ์ด ํด์ ๋ชจ๋ ์ซ์๋ค์ ์กฐํฉ์ ๊ณ ๋ คํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์์ด๋ก ํด ์ฃผ๋ ๊ฒ์ด๋ค. ์๋ฅผ ๋ค์ด์, "17"์ด ์ฃผ์ด์ง ์ซ์๋ผ๋ฉด 17๊ณผ 71์ด ๋ชจ๋ ๊ณ ๋ ค๋์ด์ผ ํ๋ฏ๋ก, ์์ด์ ์ฌ์ฉํ์ฌ ๊ฐ๋ฅํ ๋ชจ๋ ์์๋ฅผ ๋ง๋ค๊ณ , ๊ทธ ์ค์์ ์์์ธ ์ซ์๋ง ์ฐพ์ ์ค ๊ฒ์ด๋ค.
์ด ๋ ์ค๋ณต๋ ์กฐํฉ์ด ๋ฐ์๋๋๋ฐ numSet์ ์ค๋ณต๋ ๊ฐ์ ์๋์ผ๋ก ์ ๊ฑฐํด ์ฃผ๊ธฐ ๋๋ฌธ์, ๋์ผํ ์์ด์ด ์ฌ๋ฌ ๋ฒ ์์ฑ๋๋๋ผ๋ Set์ ํ ๋ฒ๋ง ์ ์ฅ๋๋ค.
์ด ์ฝ๋ StringBuilder ์ฐ๋ฉด?
(3) ์์์ธ ์ซ์์ ๊ฐ์๋ฅผ ๋ฐํํ solution ๋ฉ์๋ ๋ง๋ค๊ธฐ
public int solution(String numbers) {
numSet.clear(); // numSet ์ด๊ธฐํ
// generatePermutations ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ์ซ์๋ค์ ๋ชจ๋ ์์ด์ ์์ฑ
// ์ฒ์์๋ ๋น ๋ฌธ์์ด์ prefix๋ก ์ฌ์ฉํ๊ณ , numbers๋ ์
๋ ฅ๋ ์ซ์ ๋ฌธ์์ด
generatePermutations("", numbers);
// ์์์ ๊ฐ์๋ฅผ ์
๋ณ์ count๋ฅผ 0์ผ๋ก ์ด๊ธฐํ
int count = 0;
// numSet์ ์ ์ฅ๋ ์ซ์๋ฑ ์ค ์์์ธ ์ซ์์ ๊ฐ์๋ฅผ ์ธ๊ธฐ ์ํด Iterator๋ฅผ ์ฌ์ฉํ์ฌ ์ํ
Iterator<Integer> it = numSet.iterator();
while (it.hasNext()) {
// numSet์ ์๋ ๊ฐ ์ซ์์ ๋ํด ์์ ํ๋ณ์ ํ๊ณ , ์์๋ผ๋ฉด count๋ฅผ ์ฆ๊ฐ
int number = it.next(); // numSet์์ ๋ค์ ์ซ์๋ฅผ ๊ฐ์ ธ์ค์
if (isPrime(number)) count++; // ์์๋ฉด count 1์ฆ๊ฐ
}
return count;
}
์์์ ๋ง๋ค์ด์ค generatePermutations ๋ฅผ ํธ์ถํด์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์ String์ ๊ฐ์ง๊ณ ๋ง๋ค ์ ์๋ ๊ฐ๋ฅํ ๋ชจ๋ ์ซ์ ์กฐํฉ์ ๋ง๋ ๋ค. ๊ทธ๋ฆฌ๊ณ ์์์ ๊ฐ์๋ฅผ ์ธ์ด ์ค ๋ณ์ count์ isPrime() ๊ฐ์ด true๋ฉด +1์ฉ ํด ์ฃผ๋ฉด ๋๋ค.
์ numSet์ ์ด๊ธฐํ ํด ์ฃผ๋๊ฐ?
solution ๋ฉ์๋๊ฐ ์คํ๋ ๋๋ง๋ค numSet์ ๋น์์ฃผ๋ ์ฝ๋, ์ด ์ฝ๋๊ฐ ์์ผ๋ฉด ์ด์ ์คํ์์ ์ ์ฅ๋ ๊ฐ๋ค์ด ๋จ์ ์์ด์, ์๋ก์ด numbers ์
๋ ฅ์ ๋ํด ์ ํํ ๊ณ์ฐ์ด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
โญ 3. ์ ๋ต์ฝ๋(๋ด์ฝ๋)
import java.util.HashSet;
import java.util.Iterator;
class Solution {
private HashSet<Integer> numSet = new HashSet<>();
// ์์ ํ๋ณ ๋ฉ์๋
public static boolean isPrime(int num) {
if (num < 2) return false; // 2 ๋ฏธ๋ง์ ์์๊ฐ ์๋
for (int i = 2; i <= Math.sqrt(num); i++) { // 2๋ถํฐ √num๊น์ง ํ์ธ
if (num % i == 0) return false; // ๋๋ ๋จ์ด์ง๋ฉด ์์๊ฐ ์๋
}
return true; // ๋๋ ๋จ์ด์ง์ง ์์ผ๋ฉด ์์
}
// ์์ด์ ์์ฑํ๋ ์ฌ๊ท ๋ฉ์๋
public void generatePermutations(String prefix, String str) {
if (!prefix.isEmpty()) {
numSet.add(Integer.parseInt(prefix)); // ์ซ์๋ก ๋ณํํ์ฌ Set์ ์ถ๊ฐ
}
for (int i = 0; i < str.length(); i++) {
generatePermutations(prefix + str.charAt(i),
str.substring(0, i) + str.substring(i + 1));
}
}
// ์์์ ๊ฐ์ ์ธ๋ solution ๋ฉ์๋
public int solution(String numbers) {
numSet.clear(); // numSet ์ด๊ธฐํ
generatePermutations("", numbers);
int count = 0;
Iterator<Integer> it = numSet.iterator();
while (it.hasNext()) {
int number = it.next();
if (isPrime(number)) count++;
}
return count;
}
// main ๋ฉ์๋ (ํ
์คํธ์ฉ)
public static void main(String[] args) {
Solution sol = new Solution();
System.out.println(sol.solution("17")); // ์ถ๋ ฅ: 3 (์์: 7, 17, 71)
System.out.println(sol.solution("011")); // ์ถ๋ ฅ: 2 (์์: 11, 101)
}
}
๐๐ป StringBuilder
import java.util.HashSet;
import java.util.Iterator;
class Solution {
private HashSet<Integer> numSet = new HashSet<>(); // ์ซ์ ์์ด์ ์ ์ฅํ Set
// ์์ ํ๋ณ ๋ฉ์๋
public static boolean isPrime(int num) {
if (num < 2) return false; // 2 ๋ฏธ๋ง์ ์์๊ฐ ์๋
for (int i = 2; i <= Math.sqrt(num); i++) { // 2๋ถํฐ √num๊น์ง ํ์ธ
if (num % i == 0) return false; // ๋๋์ด๋จ์ด์ง๋ฉด ์์๊ฐ ์๋
}
return true; // ๋๋์ด๋จ์ด์ง์ง ์์ผ๋ฉด ์์
}
// ์์ด์ ์์ฑํ๋ ์ฌ๊ท ๋ฉ์๋
public void generatePermutations(StringBuilder prefix, StringBuilder str) {
// prefix๊ฐ ๋น์ด์์ง ์์ผ๋ฉด numSet์ ์ซ์๋ก ๋ณํํ์ฌ ์ถ๊ฐ
if (prefix.length() > 0) {
numSet.add(Integer.parseInt(prefix.toString()));
}
// str์ ๋จ์ ์๋ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ ํํ์ฌ ์์ด์ ์์ฑ
for (int i = 0; i < str.length(); i++) {
// ํ์ฌ ๋ฌธ์๋ฅผ prefix์ ์ถ๊ฐํ๊ณ str์์ ์ ๊ฑฐ
char removed = str.charAt(i);
prefix.append(removed);
str.deleteCharAt(i);
// ์ฌ๊ท ํธ์ถ๋ก ๋๋จธ์ง ๋ฌธ์๋ค๋ก ์์ด์ ์์ฑ
generatePermutations(prefix, str);
// ๋ฐฑํธ๋ํน: ์ ํํ ๋ฌธ์๋ฅผ ๋ค์ ์๋ ์ํ๋ก ๋ณต๊ตฌ
prefix.deleteCharAt(prefix.length() - 1);
str.insert(i, removed);
}
}
// solution ๋ฉ์๋
public int solution(String numbers) {
numSet.clear(); // numSet ์ด๊ธฐํ (์ด์ ์ ์ ์ฅ๋ ๊ฐ ์ญ์ )
generatePermutations(new StringBuilder(), new StringBuilder(numbers)); // ์์ด ์์ฑ
int count = 0;
// numSet์ ์ ์ฅ๋ ์ซ์๋ค์ ์ํํ๋ฉด์ ์์์ธ ์ซ์๋ง ์นด์ดํธ
Iterator<Integer> it = numSet.iterator();
while (it.hasNext()) {
int number = it.next();
if (isPrime(number)) count++; // ์์์ด๋ฉด count ์ฆ๊ฐ
}
return count; // ์์์ ๊ฐ์๋ฅผ ๋ฐํ
}
}
generatePermutations๋ง ๋ถ์ฐ ์ค๋ช
public void generatePermutations(StringBuilder prefix, StringBuilder str) {
// prefix๊ฐ ๋น์ด์์ง ์์ผ๋ฉด numSet์ ์ซ์๋ก ๋ณํํ์ฌ ์ถ๊ฐ
if (prefix.length() > 0) {
numSet.add(Integer.parseInt(prefix.toString())); // ํ์ฌ๊น์ง ๋ง๋ค์ด์ง ์์ด์ ์ซ์๋ก ๋ณํํ์ฌ Set์ ์ถ๊ฐ
}
// str์ ๋จ์ ์๋ ๋ฌธ์๋ฅผ ํ๋์ฉ ์ ํํ์ฌ ์์ด์ ์์ฑ
for (int i = 0; i < str.length(); i++) {
// ํ์ฌ ๋ฌธ์๋ฅผ prefix์ ์ถ๊ฐํ๊ณ str์์ ์ ๊ฑฐ
char removed = str.charAt(i); // str์์ i๋ฒ์งธ ๋ฌธ์๋ฅผ ์ ํ
prefix.append(removed); // ์ ํ๋ ๋ฌธ์๋ฅผ prefix์ ์ถ๊ฐ
str.deleteCharAt(i); // str์์ ํด๋น ๋ฌธ์๋ฅผ ์ ๊ฑฐ
// ์ฌ๊ท ํธ์ถ๋ก ๋๋จธ์ง ๋ฌธ์๋ค๋ก ์์ด์ ์์ฑ
generatePermutations(prefix, str); // ๋จ์ ๋ฌธ์๋ค๋ก ์์ด์ ๋ง๋ค๊ธฐ ์ํด ์ฌ๊ท ํธ์ถ
// ๋ฐฑํธ๋ํน: ์ ํํ ๋ฌธ์๋ฅผ ๋ค์ ์๋ ์ํ๋ก ๋ณต๊ตฌ
prefix.deleteCharAt(prefix.length() - 1); // ๋ง์ง๋ง์ผ๋ก ์ถ๊ฐํ ๋ฌธ์๋ฅผ prefix์์ ์ ๊ฑฐ
str.insert(i, removed); // ์ญ์ ๋ ๋ฌธ์๋ฅผ ๋ค์ str์ ์ฝ์
ํ์ฌ ์๋ ์ํ๋ก ๋ณต๊ตฌ
}
}
๐๐ป ์ข์์ ์ ์ผ ๋ง์ด ๋ฐ์ ์ฝ๋
import java.util.HashSet;
class Solution {
public int solution(String numbers) {
HashSet<Integer> set = new HashSet<>();
permutation("", numbers, set);
int count = 0;
while(set.iterator().hasNext()){
int a = set.iterator().next();
set.remove(a);
if(a==2) count++;
if(a%2!=0 && isPrime(a)){
count++;
}
}
return count;
}
public boolean isPrime(int n){
if(n==0 || n==1) return false;
for(int i=3; i<=(int)Math.sqrt(n); i+=2){
if(n%i==0) return false;
}
return true;
}
public void permutation(String prefix, String str, HashSet<Integer> set) {
int n = str.length();
//if (n == 0) System.out.println(prefix);
if(!prefix.equals("")) set.add(Integer.valueOf(prefix));
for (int i = 0; i < n; i++)
permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i+1, n), set);
}
}