๐ ์๊ณ ๋ฆฌ์ฆ ์ ํ
์ด ๋ฌธ์ ๋ ๋นผ์ง๋ ์๋ 3๊ฐ, ๋นผ๋ ์ซ์๋ 3๊ฐ๋ผ ๋์ ๋ฌธ์ ๋ณด๋ค ๋ ๋ณต์กํ๊ฒ ๋๊ปด์ก๋ ๋ฌธ์ ์๋ค.
BFS๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉํ ๊ณต๊ฒฉ ํจํด์ ๋ฐ๋ผ SCV ๊ฐ๋ค์ ๊ฐ์์์ผ๋ฉฐ ๊ณต๊ฒฉ ์ต์ ํ์๋ฅผ ๊ตฌํ๊ณ ,
DP๋ฅผ ์ด์ฉํ์ฌ ๊ฐ์๋ SCV ๊ฐ๋ค์ ๊ธฐ์ตํ์ฌ ์ค๋ณต ์ฐ์ฐ ํ์๋ฅผ ์ค์๋ค.
`๐ ํ์ด
1๏ธโฃ scv์ ์๊ฐ 3๊ฐ๊ฐ ๋๋๋ก ํ๋ค.
๊ทธ๋์ N์ด 1์ด๋ 2์ผ ๊ฒฝ์ฐ์๋ scv์ ์๊ฐ ์ด 3๊ฐ๊ฐ ๋๋๋ก 0์ ์ฑ์์ค๋ค.
2๏ธโฃ visited[][][]์ 3์ฐจ์ ๋ฐฐ์ด์ ํตํด scv์ ๋ณํ๋ฅผ ๊ธฐ๋กํ๋ค.
๋ง์ฝ, visited[i][j][k] = 1์ผ ๊ฒฝ์ฐ, 0๋ฒ ์ด์์ ๊ณต๊ฒฉ์ ํตํด (i, j, k)์ ๋๋ฌํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ด๋ฏธ ๋๋ฌํ ๋ฐฐ์ด์ ๋ํด์๋ ๋ค์ ์ฐ์ฐํ ํ์๊ฐ ์์ผ๋ฏ๋ก ์ฐ์ฐ์ ๋ฉ์ถ๋ค.
3๏ธโฃ (i, j, k)์ (i, k, j)๋ ๊ฐ์ ์์ ์ด๊ธฐ ๋๋ฌธ์,
visited[][][]์ 3์ฐจ์ ๋ฐฐ์ด ์ธ๋ฑ์ค์ ๊ฐ๋ค์ ๋ํด์๋ ๋ฐ๋์ ์ ๋ ฌํ์ฌ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์ ๋ ฌ์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ํด์ฃผ์๋ค.
4๏ธโฃ ํ ๋ฒ์ ๊ณต๊ฒฉ์ ๋ํด์ 9, 3, 1 ๋งํผ 3๊ฐ์ scv์ ๊ณต๊ฒฉ์ ํ ์ ์์ผ๋ฏ๋ก, ์ด 6๊ฐ์ ๊ณต๊ฒฉ ํจํด์ด ์กด์ฌํ๋ค.
๊ทธ์ ๋ฐ๋ผ 6๊ฐ์ ์ฌ๊ทํจ์๊ฐ ํ์ํ๋ค.
5๏ธโฃ 3๊ฐ์ scv์ ๋ํด์ ๋ชจ๋ 0 ์ดํ๊ฐ ๋๋ฉด ์ข ๋ฃํ๋ค.
๐ ์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
static int N;
static ArrayList<Integer> scv;
static int[][][] visited;
static int result = Integer.MAX_VALUE;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine()); // SCV์ ์
scv = new ArrayList<>();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int i = 0; i < N; i++)
scv.add(Integer.parseInt(st.nextToken()));
for(int i = N; i < 3; i++)
scv.add(0);
visited = new int[61][61][61];
cal(scv.get(0), scv.get(1), scv.get(2), 0);
System.out.println(result);
}
public static void cal(int a, int b, int c, int cnt) {
a = Math.max(0, a);
b = Math.max(0, b);
c = Math.max(0, c);
int max = Math.max(Math.max(a, b), c);
int min = Math.min(Math.min(a, b), c);
int mid = a + b + c - max - min;
a = max;
b = mid;
c = min;
if(a <= 0 && b <= 0 && c <= 0) {
result = Math.min(cnt, result);
return;
}
if(visited[a][b][c] == 1)
return;
else
visited[a][b][c] = 1;
if(result < cnt)
return;
cal(a-9, b-3, c-1, cnt+1);
cal(a-9, b-1, c-3, cnt+1);
cal(a-3, b-9, c-1, cnt+1);
cal(a-3, b-1, c-9, cnt+1);
cal(a-1, b-9, c-3, cnt+1);
cal(a-1, b-3, c-9, cnt+1);
return;
}
}
https://www.acmicpc.net/problem/12869
12869๋ฒ: ๋ฎคํ๋ฆฌ์คํฌ
1, 3, 2 ์์๋๋ก ๊ณต๊ฒฉ์ ํ๋ฉด, ๋จ์ ์ฒด๋ ฅ์ (12-9, 10-1, 4-3) = (3, 9, 1)์ด๋ค. 2, 1, 3 ์์๋๋ก ๊ณต๊ฒฉ์ ํ๋ฉด, ๋จ์ ์ฒด๋ ฅ์ (0, 0, 0)์ด๋ค.
www.acmicpc.net
๋๊ธ