1. ๋ฌธ์ ์ค๋ช ๐
2. ๊ตฌํ ๋ฐฉ๋ฒ ๐๏ธ
KEY WORD
: SIMUlATION
, BRUTE FORCE
- 0๏ธโฃ ์ท๋์ดํ ๊ตฌํ, ๋ง์ ์์น ๋ํ๋ผ ๋ฐฐ์ด ๊ตฌํ
- 1๏ธโฃ 10๋ฒ์ ์ฃผ์ฌ์ ๊ฐ๊ฐ์ผ๋ก ์์ง์ผ ๋ง์ ์ค๋ณต์์ด๋ก ๊ตฌํ๋ค. ($4^{10}$)
- 2๏ธโฃ ์ด์ ์ฃผ์ฌ์ ํ๋๋น ์์ง์ผ ๋ง์ด ๋ฌด์์ธ์ง ์์๋ ์ ํ์์ผ๋ก, ๊ทธ๋๋ก ๋ง์ ์์ง์ฌ ๋ณธ๋ค.
- 2๏ธโฃ-1) ํ์ฌ ์์ง์ผ ๋ง์ ์์ ๋
ธ๋์
ํ๋์ ํ์ดํ
๊ฐ ์์ ๊ฒฝ์ฐ, ๊ทธ๊ฒ์ด ๊ฐ๋ฆฌํค๋ ๊ณณ์ผ๋ก ์ด๋ - 2๏ธโฃ-2) ์ท๋์ด ํ์ ์ต์ข ์์น๊ฐ ์๋๋ฐ๋, ๋ง์ด ๋์ฐฉํ ์์น์ ๋ค๋ฅธ ๋ง์ด ์ด๋ฏธ ์กด์ฌํ๋ค๋ฉด ์ด๋ฒ ์์๋ ์๋ฏธ๊ฐ ์์ผ๋ฏ๋ก, 1๏ธโฃ๋ก ํ๊ท
- 2๏ธโฃ-3) 1๏ธโฃ๋ฒ์์ ๊ตฌํ ๋ชจ๋ ๋ง์ ์์์ ๋ํ์ฌ 2๏ธโฃ์ ์งํํ๋ค.
- 2๏ธโฃ-1) ํ์ฌ ์์ง์ผ ๋ง์ ์์ ๋
ธ๋์
- 3๏ธโฃ ์ง๊ธ๊น์ง ์งํํ ์์ ์ค ๋์ ์ ์ ๊ฐ์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.
(1) ํ์๊ฐ ์ท๋์ดํ์ ์ ๋ ฅ์ผ๋ก ๋ฃ์ ๋ฐฉ๋ฒ
์ด ๋ฐฐ์ด 33๊ฐ์ ๊ฐ์ ์ฐจ๋ก๋๋ก ๋ฃ์๋๋ฐ, ์ฃผํฉ โ ํ๋ โ ๋ถํ โ ๋ น์ ์์๋ก ๋ฃ์๋ค.
private static class Node {
int score;
int blue;
int red;
public Node (int score, int blue, int red){
this.score = score;
this.blue = blue;
this.red = red;
}
}
์ท๋์ด์ ๋
ธ๋๋ฅผ ๋ํ๋ด๋ Class Node
๋ ๋ชจ๋ ํ๋์ ํ์ดํ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ชฉ์ ์ง
, ๋นจ๊ฐ์ ํ์ดํ๊ฐ ๊ฐ๋ฆฌํค๋ ๋ชฉ์ ์ง
๋ฅผ ๊ฐ์ง๊ณ ์๊ณ , ํ๋์ ํ์ดํ๊ฐ ์๋ ๊ฒฝ์ฐ, -1
์ ์ ์ฅํ๋ค.
(2) ์๊ฐ๋ณต์ก๋ ๋ถ์ ๐
์ท๋์ด ํ์ Node
์: 33
๊ฐ, ๋ง์ ์: 4
, ์์ง์: 10
๋ฒ
์ค๋ณต ์์ด์ 10๊ฐ์ ์นธ์ด 4๊ฐ ์ค ํ๋๋ฅผ ์ ํํ๋ ๊ฒ์ด์์์ผ๋ก, $4^{10} = 1048576$ ๊ฐ์ ์์๊ฐ ์กด์ฌํ๋ค.
ํ๋์ ์์ ๋น, 10๊ฐ์ ์์ง์์ด ์๊ณ , ํ๋์ ์์ง์ ๋น ๊ฐ ์ ์๋ ์ต๋ ๊ฑฐ๋ฆฌ๋ 5์. $50$
์ด $52,428,800$ ๋ฒ์ ์ฐ์ฐ์ด ํ์. ์ด๋ $10^{7}$์์ $10^{8}$ ์ฌ์ด์์ผ๋ก SAFE
3. ์ฝ๋ ์๊ฐ ๐
(1) SUDO CODE
- 0๏ธโฃ
init()
: ์ท๋์ด ํ์ ์ ๋ ฅ์ผ๋ก ์ฃผ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ถ ๋ฐ์์ผํจ ใทใท. (์ด๊ฒ ๋นก์นจ)`dice_num []`: ๋์ ธ์ ๋์จ ์ฃผ์ฌ์ ๋ฐ์ดํฐ ๋ฐ๊ธฐ
- 1๏ธโฃ
set Order()
:์ค๋ณต ์์ด
์ ํ์ฉํด 10๋ฒ์ ์ฃผ์ฌ์ ๊ฒฐ๊ณผ๊ฐ ๊ฐ๊ฐ ์ด๋ค ์ท๋์ด ๋ง์ ๊ฒ์ธ์ง ์์ ์ ํ๊ธฐ - 2๏ธโฃ ์ด์ 10๋ฒ์ ์ฃผ์ฌ์ ๊ฐ๊ฐ ๋์ง ์ฌ๋์ด ๋๊ตฌ์ธ์ง ์ ํด์ก์ ๋ฐ๋ผ์ ์ด์ 10๋ฒ์ ์ฃผ์ฌ์ ๊ฒฐ๊ณผ์ ๋ง๊ฒ ๋ง์ ์ฎ๊ธด๋ค.
- 2๏ธโฃ-0)
horse_loc []
: ์ด๋ฒ ์์์ ๋ง๊ฒ ์ด๋ํ์ ๋, ๋ง๋ค์ ์์น,`is exist []`: index = ๋ ธ๋ ๋ฒํธ, value = ๊ทธ๊ณณ์ ๋ง์ด ์๋๊ฐ? `now_horse_num`: ์์ง์ผ ๋ง์ ๋ฒํธ `now_moving_cnt`: ํ์ฌ ์ฌ์ฉํ ์ฃผ์ฌ์ ๊ฒฐ๊ณผ(๋ง์ ์์ง์ผ ํ์) `now_horse_location`: ์ด๋ฒ์ ์์ง์ผ ๋ง์ ํ ์์น
- 2๏ธโฃ-1) ์ฃผ์ฌ์ ๊ฒฐ๊ณผ์ ๋ง๊ฒ ๋ง์ ์์ง์ธ๋ค. (๋ง์ฝ ์ฒ์์ ๋ง์ด ์์๋ ์์น๊ฐ ํ๋ ํ์ดํ๊ฐ ์๋ ๊ณณ์ด๋ผ๋ฉด, ํ๋ ํ์ดํ ์ชฝ์ผ๋ก ๊ฐ๋ค.)
- 2๏ธโฃ-2) ์ด๋์ ๋ง์น๊ณ ์ ์๋ ๊ณณ์ ์ด๋ฏธ ๋ค๋ฅธ ๋ง์ด ์๋ค๋ฉด -1 returnํ๊ณ ๊ทธ๋๋ก 2๏ธโฃ ์ข ๋ฃํ๊ณ ๋ค์ 1๏ธโฃ์ํ
- 2๏ธโฃ-3) ์ง๊ธ์ ์ด๋์ด ์ ํจํ๋ค๋ฉด, 2๏ธโฃ-0)์ ๋ณ์๋ค ๋ชจ๋ ํ์ฌ ์์นํ ๊ณณ์ผ๋ก ์ต์ ํ + ์ ์ ๋ํ๊ธฐ
- 2๏ธโฃ-0)
- 3๏ธโฃ ์ง๊ธ๊น์ง ์ํํ 2๏ธโฃ์ ๋ต ์ค ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
(2) JAVA CODE
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.sql.Array;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
private static class Node {
int score;
int blue;
int red;
public Node (int score, int blue, int red){
this.score = score;
this.blue = blue;
this.red = red;
}
}
static int ans = 0;
static Node [] nodes = new Node[33];
static int [] horse_loc; // ํ์ฌ ๊ฐ ๋ง๋ค์ ์์น
static boolean [] is_exist; // ํด๋น ๋
ธ๋ ๋ฒํธ์ ๋ง์ด ์กด์ฌํ๋์ง
static int [] dice_num = new int [10]; // 10๊ฐ์ ์ฃผ์ฌ์ ๋๋ฒ
static int [] horse_order = new int [10]; // ๊ฐ 10๊ฐ์ ์ฃผ์ฌ์ ๋น ์์ง์ผ ๋ง ๋ฒํธ
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st= new StringTokenizer(br.readLine());
for (int i = 0; i < 10; i++) {
dice_num[i] = Integer.parseInt(st.nextToken());
}
init();
set_order(10, 0);
System.out.println(ans);
}
public static void set_order(int n, int k){
if(n == k) {
ans = Math.max(ans, move());
return;
}
for (int i = 0; i < 4; i++) {
horse_order[k] = i;
set_order(n, k+1);
}
}
public static int move(){
int sum_score = 0;
horse_loc = new int [4];
is_exist = new boolean[33];
for (int i = 0; i < 10; i++) {
int now_horse_num = horse_order[i];
int now_moving_cnt = dice_num[i];
int now_horse_location = horse_loc[now_horse_num];
is_exist[now_horse_location] = false;
for (int j = 0; j < now_moving_cnt; j++) {
if(j == 0 && nodes[now_horse_location].blue != -1){
now_horse_location = nodes[now_horse_location].blue;
}else{
now_horse_location = nodes[now_horse_location].red;
}
}
if(now_horse_location < 32 && is_exist[now_horse_location]) return -1; // ์ด๋ฏธ ๊ทธ ์์น์ ๋๊ตฐ๊ฐ ์๋ค๋ฉด, ์ด๋ฒ ์ฃผ๊ธฐ๋ ์๋๋ ์ฃผ๊ธฐ ๋ฐ๋ผ์ ๊ทธ๋ฅ ํ์ถ
horse_loc[now_horse_num] = now_horse_location;
is_exist[now_horse_location] = true;
sum_score += nodes[now_horse_location].score;
}
return sum_score;
}
public static void init(){
for (int i = 0; i <= 20; i++) {
nodes[i] = new Node(i*2, -1, i+1);
}
// ์ค์ ์ญ์๊ฐ ํํ
nodes[21] = new Node(13,-1,22);
nodes[22] = new Node(16,-1,23);
nodes[23] = new Node(19,-1,24);
nodes[24] = new Node(25,-1,30); // ์ค์ ๋
ธ๋
nodes[25] = new Node(26,-1,24);
nodes[26] = new Node(27,-1,25);
nodes[27] = new Node(28,-1,26);
nodes[28] = new Node(22,-1,29);
nodes[29] = new Node(24,-1,24);
nodes[30] = new Node(30,-1,31);
nodes[31] = new Node(35,-1,20);
// ํ๋์ ๊ธธ ์ถ๊ฐ
nodes[5].blue = 21;
nodes[10].blue = 28;
nodes[15].blue = 27;
// ๋์ฐฉ ๋
ธ๋ ์ถ๊ฐ ๋ฐ ๋์ฐฉ ์ ๋
ธ๋ red ์์
nodes[32] = new Node(0, -1,32);
nodes[20].red = 32;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
WOW, ์ด๋ฐ ์ ํ์ ๋ฌธ์ ๋ฅผ ์ฐธ ์ค๋๋ง์ ์ ํด๋ด์, ์ฒ์ ๋ง๋ฅ๋จ๋ ธ์ ๋ ๋ฉ๋ถ์ด์๋ค. ๊ฐ์ธ์ ์ผ๋ก ๋ฐฑํธ๋ํน ์ํ ๋ฌธ์ ๋ฅผ ์ซ์ดํ๋๋ฐ, ๊ทธ ์ด์ ๋ ๋๋ฒ๊น ํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ ํ๋ ๊ฒ ๋๋ฌด ์ด๋ ต๊ธฐ ๋๋ฌธ์ด๋ค.
(1) ํค๋ฉ ๋ถ๋ถ
a. ํ ๋ฒ์ ์์๋ง๋ค ๋ชจ๋ ๋ง์ ์์น์ is_exist ๋ฐฐ์ด์ ์ด๊ธฐํ ํ๊ณ ๋ค์ ์ฒ์๋ถํฐ ์์ํด์ผ ํ๋ค. ์ด๋ฅผ ์ ๊ณ ์ณ์ค์ ์๊พธ ํ๋ ธ๋ค.
b. ๋์ฐฉ์ง์์๋ ๋ง๋ค์ด ๊ณต์กดํด๋ ๋๋ค. ์ด์ ๋ํ ์ฒ๋ฆฌ๋ฅผ ์ ํด์ค์ ํ๋ ธ๋ค.