๐ง ํ๋ก๊ทธ๋๋จธ์ค LV2. ์์ ์ฐพ๊ธฐ
๋ฌธ์ ์ค๋ช
ํ์๋ฆฌ ์ซ์๊ฐ ์ ํ ์ข ์ด ์กฐ๊ฐ์ด ํฉ์ด์ ธ์์ต๋๋ค. ํฉ์ด์ง ์ข ์ด ์กฐ๊ฐ์ ๋ถ์ฌ ์์๋ฅผ ๋ช ๊ฐ ๋ง๋ค ์ ์๋์ง ์์๋ด๋ ค ํฉ๋๋ค.
๊ฐ ์ข ์ด ์กฐ๊ฐ์ ์ ํ ์ซ์๊ฐ ์ ํ ๋ฌธ์์ด numbers๊ฐ ์ฃผ์ด์ก์ ๋, ์ข ์ด ์กฐ๊ฐ์ผ๋ก ๋ง๋ค ์ ์๋ ์์๊ฐ ๋ช ๊ฐ์ธ์ง return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ํ ์ฌํญ
- numbers๋ ๊ธธ์ด 1 ์ด์ 7 ์ดํ์ธ ๋ฌธ์์ด์ ๋๋ค.
- numbers๋ 0~9๊น์ง ์ซ์๋ง์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- "013"์ 0, 1, 3 ์ซ์๊ฐ ์ ํ ์ข ์ด ์กฐ๊ฐ์ด ํฉ์ด์ ธ์๋ค๋ ์๋ฏธ์ ๋๋ค.
์ ์ถ๋ ฅ ์
numbers | return |
"17" | 3 |
"011" | 2 |
๐ก ๋ฌธ์ ํ์ด
์ข ์ด์กฐ๊ฐ์ ์กฐํฉํด์ ์ซ์๋ฅผ ๋ง๋ ํ, ์์์ธ ์ซ์์ ๊ฐ์๋ฅผ ๊ตฌํด์ผํ๋ค. ์ฌ๊ธฐ์ ์์ด๋ก ์ซ์๋ฅผ ๋ง๋ค๊ณ , ์์์ธ์ง ํ๋ณํ๋ ์๊ณ ๋ฆฌ์ฆ์ด ํ์ํ๋ค.
numbers ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ์์ด์ ์ด์ฉํด์ ์กฐํฉ ๊ฐ๋ฅํ ์ซ์ ๋ฆฌ์คํธ๋ฅผ ๊ตฌํ๋ค.
import java.util.*;
class Solution {
static boolean[] visited;
static List<Long> al = new ArrayList<>();
public int solution(String numbers) {
for (int i = 1; i <= numbers.length(); i++) { // ์ซ์ ์นด๋ i๊ฐ ์ฌ์ฉ
visited = new boolean[numbers.length()];
permutation(numbers, "", i);
}
return 0;
}
private void permutation(String numbers, String str, int cnt) {
if (str.length() == cnt) {
long num = Long.valueOf(str); // ๋ฌธ์์ด์ Long ํ์
์ซ์๋ก ๋ณํ
if (!al.contains(num)) al.add(num); // ์ค๋ณต๋๋ ์๊ฐ ์๋๋ก ํ๋ค.
return;
}
for (int i = 0; i < numbers.length(); i++) {
if (visited[i]) continue;
visited[i] = true;
permutation(numbers, str + numbers.charAt(i), cnt);
visited[i] = false;
}
}
}
์์ด์ ๊ตฌํด์ผํ๋ฏ๋ก visited ๋ฐฐ์ด์ ํ์ฉํ๋ค. ๋ฐฉ๋ฌธํ ์ธ๋ฑ์ค๋ฅผ ์ ์ธํ numbers์ ์ธ๋ฑ์ค ๊ฐ์ str ๋ฌธ์์ด์ ์ถ๊ฐํ๊ณ , str ๋ฌธ์์ด์ด ์ง์ ํ ๊ธธ์ด(cnt)์ ๋๋ฌํ๋ฉด ๋ฆฌ์คํธ์ ์ถ๊ฐํ๊ณ ๋ฉ์๋๋ฅผ ์ข ๋ฃํ๋ค. ์ฌ๊ท๋ฅผ ํ์ฉํ์ฌ ํด๋น ๊ณผ์ ์ ๋ฐ๋ณตํด์ ์์ด๋ก ๊ตฌํ ์ ์๋ ๋ชจ๋ ์ผ์ด์ค์ ์๋ฅผ ๊ตฌํด์ al ๋ฆฌ์คํธ์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฝ์ ํ๋ค. ์์ธํ ์์ด ๋ฐฉ์์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ค.
https://sskl660.tistory.com/48?category=879763
์ด์ al ๋ฆฌ์คํธ์ ์ฝ์ ํ ์๋ฅผ ํ๋์ฉ ๊บผ๋ด์ ์์์ธ์ง ํ๋ณํ๊ณ , ๊ทธ ๊ฐ์๋ฅผ ๊ตฌํ๋ฉด ๋๋ค.
private boolean isPrime(long num) {
if (num == 1 || num == 0) return false;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
์์์ธ์ง ํ๋ณํ๋ ์ฝ๋์ด๋ค. ๊ฐ์ด 1์ด๊ฑฐ๋ 0์ด๋ฉด false๋ฅผ ๋ฐํํ๋ค. ๊ทธ๋ฆฌ๊ณ 2๋ถํฐ num ๊ฐ์ ์ ๊ณฑ๊ทผ๊น์ง ์ํํ๋ฉด์ num๊ณผ ๋๋์ด๋จ์ด์ง๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ค. ๋๋ ๋จ์ด์ง๋ ๊ฐ์ด ์์ผ๋ฉด ์์๊ฐ ์๋๊ณ , ๊ทธ๋ฐ ๊ฐ์ด ํ๋๋ ์์ผ๋ฉด ์์์ด๋ค. ์์ธํ ์๊ณ ๋ฆฌ์ฆ์ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํ๋ค.
์ ํ์ด ๋ฐฉ์์ ์ ์ฒด ์ฝ๋๋ก ํ์ด๋ด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
import java.util.*;
class Solution {
static boolean[] visited;
static List<Long> al = new ArrayList<>();
public int solution(String numbers) {
for (int i = 1; i <= numbers.length(); i++) {
visited = new boolean[numbers.length()];
permutation(numbers, "", i);
}
int answer = 0;
for (long num : al) {
if (isPrime(num)) answer++;
}
return answer;
}
private boolean isPrime(long num) {
if (num == 1 || num == 0) return false;
for (int i = 2; i <= Math.sqrt(num); i++) {
if (num % i == 0) return false;
}
return true;
}
private void permutation(String numbers, String str, int cnt) {
if (str.length() == cnt) {
long num = Long.valueOf(str);
if (!al.contains(num)) al.add(num);
return;
}
for (int i = 0; i < numbers.length(); i++) {
if (visited[i]) continue;
visited[i] = true;
permutation(numbers, str + numbers.charAt(i), cnt);
visited[i] = false;
}
}
}
โจ ํฌ์คํ ์ ๋ง์น๋ฉฐ
๋น์ทํ ์ ํ ๋ฌธ์ ์์๋ ์กฐํฉ(combination)์ ๋ง์ด ์ฌ์ฉํ์๋๋ฐ, ์์ด(permutation) ๋ฐฉ์๋ ๊ธฐ์ตํด๋ฌ์ผ๊ฒ ๋ค.