[Programmers] ์์ ํ์ ์์ ์ฐพ๊ธฐ
๋ฌธ์
๋ฌธ์ ์ค๋ช
Programmers - ์์ ํ์ ์์ ์ฐพ๊ธฐ
ํ์๋ฆฌ ์ซ์๊ฐ ์ ํ ์ข ์ด ์กฐ๊ฐ์ด ํฉ์ด์ ธ์์ต๋๋ค. ํฉ์ด์ง ์ข ์ด ์กฐ๊ฐ์ ๋ถ์ฌ ์์๋ฅผ ๋ช ๊ฐ ๋ง๋ค ์ ์๋์ง ์์๋ด๋ ค ํฉ๋๋ค. ๊ฐ ์ข ์ด ์กฐ๊ฐ์ ์ ํ ์ซ์๊ฐ ์ ํ ๋ฌธ์์ด numbers๊ฐ ์ฃผ์ด์ก์ ๋, ์ข ์ด ์กฐ๊ฐ์ผ๋ก ๋ง๋ค ์ ์๋ ์์๊ฐ ๋ช ๊ฐ์ธ์ง return ํ๋๋ก solution ํจ์๋ฅผ ์์ฑํด์ฃผ์ธ์.
์ ๋ ฅ
๊ฐ ์ข ์ด ์กฐ๊ฐ์ ์ ํ ์ซ์๊ฐ ์ ํ ๋ฌธ์์ด numbers
numbers | return |
---|---|
โ17โ | 3 |
โ011โ | 2 |
์ถ๋ ฅ
์ข ์ด ์กฐ๊ฐ์ผ๋ก ๋ง๋ค ์ ์๋ ์์๊ฐ ๋ช ๊ฐ์ธ์ง ์ถ๋ ฅํ๋ค.
์ ํ
- numbers๋ ๊ธธ์ด 1 ์ด์ 7 ์ดํ์ธ ๋ฌธ์์ด์ ๋๋ค.
- numbers๋ 0~9๊น์ง ์ซ์๋ง์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
- โ013โ์ 0, 1, 3 ์ซ์๊ฐ ์ ํ ์ข ์ด ์กฐ๊ฐ์ด ํฉ์ด์ ธ์๋ค๋ ์๋ฏธ์ ๋๋ค.
ํ์ด
ํด์ค
์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด 0๋ถํฐ 7์๋ฆฌ ์๋ค์ ์์ ์ฌ๋ถ๋ฅผ ๊ตฌํ๋ค.
์ดํ ์์ด์ ์ด์ฉํด ๋ฌธ์์ด๋ก ๋ง๋ค ์ ์๋ ์๋ฅผ ๋ชจ๋ ๊ตฌํ ๋ค ๊ฐ๊ฐ์ ์๊ฐ ์์๋ผ๋ฉด ํด์๋งต์ ์ถ๊ฐํ๋ค.
์ต์ข ์์์ ๊ฐ์๋ ํด์๋งต์ ๊ธธ์ด๊ฐ ๋จ!
์ฝ๋
import java.io.*;
import java.util.*;
/**
* [0204] PGS ์์ ํ์ ์์ ์ฐพ๊ธฐ
* ์์ ํ์, ์์ด, ์์ ๊ตฌํ๊ธฐ, ์๋ผํ ์คํ
๋ค์ค์ ์ฒด
*/
public class PGS_์์ ํ์_์์์ฐพ๊ธฐ {
final int INF = 10000000;
int size;
boolean[] isPrime = new boolean[INF]; // 0 ~ 10000000๊น์ง ์๋ค์ด ๊ฐ๊ฐ ์์์ธ์ง ์ฌ๋ถ
int[] number;
HashMap<Integer, Boolean> paperPrimeNumbers = new HashMap<>(); // ์ฃผ์ด์ง ๋ฌธ์์ด์์ ๋ง๋ค ์ ์๋ ์์๋ฅผ ์ ์ฅ
public int solution(String numbers) {
size = numbers.length();
number = new int[size];
// ์๋ผํ ์คํ
๋ค์ค์ ์ฒด๋ก ์์ ๋จผ์ ๊ตฌํ๊ณ
getPrimeNumbers();
// ๋ฌธ์์ด ์ซ์ ์กฐํฉํ ์์ด ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์์ธ์ง ์ฒดํฌํ์ฌ ๊ฐ์ ๊ตฌํ๊ธฐ
int answer = countPrimeNumbers(numbers, "", new boolean[size]);
return answer;
}
// ์๋ผํ ์คํ
๋ค์ค์ ์ฒด๋ก ์์ ๊ตฌํ๊ธฐ
public void getPrimeNumbers() {
// ๋ชจ๋ ์๋ฅผ ์์๋ผ๊ณ ์ด๊ธฐํํ ๋ค
for (int i=0; i<INF; i++) isPrime[i] = true;
// 0, 1์ ์์๊ฐ ์๋๋ฏ๋ก ์ด๊ธฐํ
isPrime[0] = isPrime[1] = false;
// 2๋ถํฐ ์์์ธ ์๋ ์์ ์ ๋ฐฐ์๋ฅผ ๋ชจ๋ ์์๊ฐ ์๋ ์๋ก ๊ฐฑ์
for (int i=2; i*i<INF; i++) { // ์ด๋ ์ ์ฒด์ ์ ๊ณฑ๊ทผ๊น์ง๋ง ์ฐพ์
if (isPrime[i]) {
// i*i ์ดํ๋ ์์ ํ๋ณ ๋๋ฌ์ผ๋ฏ๋ก ์ด์๋ถํฐ ๋ฐฐ์๋ง ์์ ์๋ ์๋ก ๊ฐฑ์
for (int j=i*i; j<INF; j+=i) isPrime[j] = false;
}
}
}
// ์์ด ๊ตฌํ๊ธฐ
public int countPrimeNumbers(String numbers, String str, boolean[] visited) {
for (int i=0; i<size; i++) {
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
if (visited[i]) continue;
visited[i] = true;
// ํ์ฌ ์์ ๋ค์ ์๋ฅผ ๋ถ์ธ ๊ฒฝ์ฐ์ ์, ์ด๋ฅผ ์ ์๋ก ํ์ฑ
String nextStr = str + numbers.charAt(i);
int num = Integer.parseInt(nextStr);
// ํ์ฑํ ์๊ฐ ์์๋ฉด ํด์๋งต์ ์ถ๊ฐ
if (isPrime[num]) paperPrimeNumbers.put(num, true);
// ๋ค์ ์๋ฅผ ๋ถ์ด๋ฌ ์ฌ๊ท ํธ์ถ
countPrimeNumbers(numbers, nextStr, visited);
// ์ฌ๊ท์์ ๋ฐํ๋๋ฉด ๋ฐฉ๋ฌธ ํด์
visited[i] = false;
}
// ํด์๋งต ํฌ๊ธฐ ๊ตฌํ๊ธฐ
return paperPrimeNumbers.size();
}
}
๐ก
- ์๋ผํ ์คํ ๋ค์ค์ ์ฒด ์๊ณ ๋ฆฌ์ฆ์ ๋งค๋ฒ ๊น๋จน๋ ๊ฒ ๊ฐ๋ค. ์ด๋ฒ ๊ธฐํ์ ์ ๋ฆฌ๊ฐ ๋๋๋ก ๋ค์ ํ์ด๋ฅผ ๋ด์ผ๊ฒ ๋ค.