[๋ฐฑ์ค/JAVA] 18311๋ฒ : ํฐ ์ ๊ตฌ์ฑํ๊ธฐ
https://www.acmicpc.net/problem/18511
๐ ๋ฌธ์ ์์ฝ
- ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์ ์ค์์, ์งํฉ KK์ ์์๋ก๋ง ๊ตฌ์ฑ๋ ๊ฐ์ฅ ํฐ ์๋ฅผ ์ฐพ์์ผ ํ๋ค.
- KK์ ์์๋ 1๋ถํฐ 9๊น์ง์ ์์ฐ์๋ก ์ ํ๋๋ค.
- ํญ์ NN๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
[ ์ค๋ต ๋
ธํธ ]
โ ๊ธฐ์กด ์ค๋ต ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken()); // 657
int K = Integer.parseInt(st.nextToken()); // 3
StringTokenizer st2 = new StringTokenizer(br.readLine());
int answer = 0;
for(int i = N; i >= 1; i--) {
// i ์ซ์๋ฅผ ๋ฌธ์์ด ๋ณํ ํ ๊ฐ ์๋ฆฟ์ซ์๊ฐ 1,5,7 ๋ก ์ด๋ฃจ์ด์ ธ์์ผ๋จ
for(int j = 0; j < K; j++) {
if(String.valueOf(i).charAt(j) != st2.nextToken().charAt(0)){
break;
}else {
answer = i;
break;
}
}
}
System.out.println(answer);
}
}
๐ ๊ธฐ์กด ์ฝ๋์ ๋ฌธ์ ์
1. K์ ์์๋ฅผ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํจ
- st2.nextToken()์ผ๋ก K์ ์์๋ฅผ ๋งค๋ฒ ํ๋์ฉ ๋ถ๋ฌ์ค์ง๋ง, ์ด ๋ฐฉ์์ K์ ๋ชจ๋ ์์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋น๊ตํด์ผ ํ๋ ๋ฌธ์ ์ ์ ํฉํ์ง ์๋ค.
- K์ ์์๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํด ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.
2. ๋นํจ์จ์ ์ธ ํ์ ๋ฐฉ์
- ๋ถํฐ 1๊น์ง ๋ชจ๋ ์์ฐ์๋ฅผ ํ์ํ๋ฉฐ ์๋ฆฟ์๋ฅผ ํ์ธํ๋ ๋ฐฉ์์ ๋นํจ์จ์ ์ด๋ค
- ์๋ฅผ ๋ค์ด, N=10000000์ผ ๋ ๋ถํ์ํ ํ์์ด ๋๋ฌด ๋ง์์ง๋ค
3. ์๋ฆฟ์ ๋น๊ต์ ๋ ผ๋ฆฌ ์ค๋ฅ
String.valueOf(i).charAt(j)๋ก i์ ์๋ฆฟ์์ K์ ์์๋ฅผ ๋น๊ตํ๋ ค ํ์ง๋ง, ์ด๋ ์๋ฆฟ์ ๊ฐ์๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
[ ์ ๋ต ์ฝ๋ & ์ฌ๋ฐ๋ฅธ ํ์ด ]
๐ ์ฌ๋ฐ๋ฅธ ํ์ด
1. K์ ์์๋ฅผ ์ ๋๋ก ํ์ฉํ์ง ๋ชปํ ๋ฌธ์ ํด๊ฒฐ
์ ์์๋ฅผ ๋ฐฐ์ด์ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ ๋ ฌํ์ฌ ํฐ ์ซ์๋ถํฐ ํ์
arr = new int[K];
for(int i = 0; i < K; i++) {
arr[i] = Integer.parseInt(st2.nextToken());
// [1,5,7]
}
2. ๊น์ด ์ฐ์ ํ์(DFS) ๋์
- ์์ฐ์๋ฅผ ์๋ฆฟ์๋ณ๋ก ํ์ฅํ๋ฉด์ ๊ฐ๋ฅํ ์กฐํฉ์ ํ์.
- ์กฐ๊ฑด: total์ด N๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋๋ง ๊ณ์ ํ์
if(total > N) return; // 657๋ณด๋ค ํฌ๋ฉด ๋ฐํ
if(answer < total) answer = total; // ๋ต ๊ณ์ ๊ฐฑ์
3. ํฐ ์ซ์๋ถํฐ ํ์
K์ ์์๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ํ์ํ์ฌ ๊ฐ๋ฅํ ํฐ ์๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฐพ์.
for(int i = K; i >= 1; i--) { // ํฐ ์ซ์๋ถํฐ ํ์
// ๋ค์ ์๋ฆฟ์๋ฅผ ๋ถ์
dfs(total * 10 + arr[i]);
๐ ์ ๋ต ์ฝ๋
import java.io.*;
import java.util.*;
public class Main {
public static int N, K, answer;
public static int[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken()); // 657
K = Integer.parseInt(st.nextToken()); // 3
StringTokenizer st2 = new StringTokenizer(br.readLine());
arr = new int[K];
for(int i = 0; i < K; i++) {
arr[i] = Integer.parseInt(st2.nextToken());
// [1,5,7]
}
Arrays.sort(arr); // ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
dfs(0);
System.out.println(answer);
}
public static void dfs(int total) {
if(total > N) return; // 657๋ณด๋ค ํฌ๋ฉด ๋ฐํ
if(answer < total) answer = total; // ๋ต ๊ณ์ ๊ฐฑ์
for(int i = K-1; i >= 0; i--) { // ํฐ ์ซ์๋ถํฐ ํ์
// ๋ค์ ์๋ฆฟ์๋ฅผ ๋ถ์
dfs(total * 10 + arr[i]);
// dfs(0)์ผ๋,
// 0 * 10 + arr[2] = 7 --> dfs(7)
// 0 * 10 + arr[1] = 5 --> dfs(5)
// 0 * 10 + arr[0] = 1 --> dfs(1)
// dfs(7)์ผ๋,
// 7 * 10 + arr[2] = 77 --> dfs(77)
// 7 * 10 + arr[1] = 75 --> dfs(75)
// 7 * 10 + arr[0] = 71 --> dfs(71)
// dfs(5)์ผ๋,
// 5 * 10 + arr[2] = 57 --> dfs(57)
// 5 * 10 + arr[1] = 55 --> dfs(55)
// 5 * 10 + arr[0] = 51 --> dfs(51)
// ...
// dfs(77)์ผ๋,
// 77 * 10 + arr[2] = 777 --> ๋ถ๊ฐ๋ฅ dfs ์ข
๋ฃ
}
}
}