๐SWEA_SW_2383
๐ [SW_2383] ์ ์ฌ ์์ฌ์๊ฐ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Solution{
static class Person implements Comparable<Person> {
int r, c, downCnt, status, time; // ํ์์น, ์ด์์น, ๋ด๋ ค๊ฐ๊ณ ์๋ ๊ณ๋จ ์, ํ์ํ, ์
๊ตฌ๊น์ง ๋์ฐฉ์๊ฐ
public Person(int r, int c) {
super();
this.r = r;
this.c = c;
}
// ์ฌ๋ ์ด๊ธฐํ
public void init() {
time = downCnt = 0;
// ์ด๋ ์ค์ธ ์ํ๋ก ์ด๊ธฐํ ( ์ด๊ธฐ์ํ )
status = M;
}
// ์ค๋ฆ์ฐจ์์ ๋์์ ์๋ ๋นผ๋๊ฒ ์ ์ผ ์ฌํ
@Override
public int compareTo(Person o) {
return this.time - o.time; // ๊ณ๋จ์
๊ตฌ๊น์ง ์์๋๋ ์๊ฐ์ด ๋น ๋ฅธ์์ผ๋ก..
}
}
// move, wait, down, complete
static final int M = 1, W = 2, D = 3, C = 4;
// ํ๋ณ์ ๊ธธ์ด, ๋ชจ๋ ๊ณ๋จ์ ๋ด๋ ค๊ฐ๋ ์ต์์๊ฐ, ์ฌ๋์
static int N, min, cnt;
// ๋ถ๋ถ์งํฉ์ ๊ตฌํ์ ์ฌ์ฉํ ์ ํ ๋ฐฐ์ด ( ์ ํ๋๋ฉด ๊ณ๋จ1, ์ ํ์ด ์๋๋ฉด ๊ณ๋จ2 )
static boolean[] selected;
// ์ฌ๋ ๋ฆฌ์คํธ
static ArrayList<Person> pList;
// ๊ณ๋จ ๋ฆฌ์คํธ
static int[][] sList;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int TC = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= TC; tc++) {
N = Integer.parseInt(br.readLine());
StringTokenizer st = null;
pList = new ArrayList<Person>();
sList = new int[2][];
min = Integer.MAX_VALUE;
for (int i = 0, k = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < N; j++) {
int c = Integer.parseInt(st.nextToken());
// ์ฌ๋์ด๋ฉด
if (c == 1) {
pList.add(new Person(i, j));
}
// ๊ณ๋จ์ด๋ฉด
else if (c > 1) {
sList[k++] = new int[] { i, j, c };
}
}
}
// ์ฌ๋ ์
cnt = pList.size();
// ์ฌ๋ ์ ๋งํผ ์ฒดํฌ ๋ฐฐ์ด ์์ฑ
selected = new boolean[cnt];
// ๊ณ๋จ ๋ฐฐ์ ํ๊ธฐ
divide(0);
System.out.println("#" + tc + " " + min);
}
}
// ๋ถ๋ถ์งํฉ์ ์ด์ฉํด์ ๊ณ๋จ ๋ฐฐ์ ( ์ฌ๋์ด ๊ณ์ ๋ฐ๋๋ค ) index : ์ฌ๋
static void divide(int index) {
if(index == cnt) {
makeList();
return;
}
// ๋ถ๋ถ์งํฉ์ ํฌํจ : ๊ณ๋จ 1์ ๋ฐฐ์
selected[index] = true;
divide(index + 1);
// ๋ถ๋ถ์งํฉ์ ๋นํฌํจ : ๊ณ๋จ 1์ ๋ฐฐ์
selected[index] = false;
divide(index + 1);
}
// selected ์ํ์ ๋ฐ๋ผ ๋ ๊ณ๋จ์ ์ด์ฉํ๋ ๊ฐ๊ฐ์ ๋ฆฌ์คํธ ์์ฑ
static void makeList() {
ArrayList<Person> aList = new ArrayList<Person>();
ArrayList<Person> bList = new ArrayList<Person>();
for (int i = 0; i < cnt; i++) {
// ํ๋ช
์ฉ ๊บผ๋ธ๋ค
Person p = pList.get(i);
// ๊บผ๋ธ ์ฌ๋ ์ด๊ธฐํ
p.init(); // time, downCnt, status ๋ฅผ ์ด๊ธฐํ
// ๊ณ๋จ 1
if (selected[i]) {
// ๊ณ๋จ ์
๊ตฌ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ตฌํ๊ธฐ
p.time = Math.abs(p.r - sList[0][0]) + Math.abs(p.c - sList[0][1]);
aList.add(p);
}
// ๊ณ๋จ 2
else {
// ๊ณ๋จ ์
๊ตฌ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ ๊ตฌํ๊ธฐ
p.time = Math.abs(p.r - sList[1][0]) + Math.abs(p.c - sList[1][1]);
bList.add(p);
}
}
// ์ด ์์์๊ฐ ์ต์๊ฐ ๊ฐฑ์
int res = go(aList, bList);
if (min > res)
min = res;
}
private static int go(ArrayList<Person> aList, ArrayList<Person> bList) {
// aList ๊ฑธ๋ฆฌ๋์๊ฐ, bList ๊ฑธ๋ฆฌ๋ ์๊ฐ
int timeA = 0, timeB = 0;
if (aList.size() > 0)
timeA = goDown(aList, sList[0][2]);
if (bList.size() > 0)
timeB = goDown(bList, sList[1][2]);
// ๋ ์ค์ ํฐ ๊ฐ ๋ฆฌํด
return timeA > timeB ? timeA : timeB;
}
// ๊ณ๋จ ๋ด๋ ค๊ฐ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ
private static int goDown(ArrayList<Person> list, int height) {
// ๊ณ๋จ ์
๊ตฌ๊น์ง ๋น ๋ฅด๊ฒ ์ค๋ ์์ผ๋ก ์ ๋ ฌ
Collections.sort(list);
// ์ฒซ๋ฒ์งธ ์ฌ๋์ ๊ณ๋จ์
๊ตฌ ๋์ฐฉ์๊ฐ๋ถํฐ ์ฒ๋ฆฌ, ํ๋ฌ๊ฐ๋ ์๊ฐ๊ฐ
int time = list.get(0).time;
// ๊ธฐ์กด ์ฌ์ด์ฆ ์ ์ฅ ( ๋ณํ๋ฉด x )
int size = list.size();
// ๋ด๋ ค๊ฐ๊ณ ์๋ ์ฌ๋์, ๋ค ๋ด๋ ค๊ฐ ์ฌ๋ ์
int ingCnt = 0, cCnt = 0;
while (true) {
// ๋งค์๊ฐ๋ง๋ค ์ฌ๋๋ค์ ํ๋์ฉ ๊บผ๋ด์ด ์ํ๋ฅผ ์ฒ๋ฆฌํ๋ค
for (int i = 0; i < size; i++) {
Person p = list.get(i);
// ์ฌ๋์ด ๋๊ฐ๋ค๊ณ ์ง์ฐ์ง ์์ ๊ฒ์ด๋ค. ( index ๊ฐ ํท๊ฐ๋ฆด ์ ์์ )
// ๋ค ๋ด๋ ค์จ ์ํ์ด๋ฉด ๊ฑด๋๋ธ ๊ฒ์ด๋ค.
if (p.status == C)
continue;
// ํ์ฌ์๊ฐ์ด ์ฌ๋์ ๊ณ๋จ ์
๊ตฌ ๋์ฐฉ์๊ฐ๊ณผ ๊ฐ์ผ๋ฉด
if (p.time == time) {
// ๋๊ธฐ์ํ๋ก ๋ฐ๊ฟ์ค๋ค.
p.status = W;
}
// ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ ์ํ , ๊ณ๋จ๋ด๋ ค๊ฐ๊ณ ์๋์ฌ๋์ด 3 ๋ณด๋ค ์์ ๋ -> ๊ณ๋จ ๋ค์ด๊ฐ ์ ์๋ค.
else if (p.status == W && ingCnt < 3) {
// ์ด๋์ํ๋ก ๋ฐ๊ฟ์ค๋ค.
p.status = D;
// ๊ณ๋จ์ 1๋ถํฐ ์์
p.downCnt = 1;
// ๊ณ๋จ์ ํ๋ช
๋ค์ด์์
++ingCnt;
}
// ์ด๋์ค์ธ ์ํ
else if (p.status == D) {
// ์์ง ๋ ๋ด๋ ค๊ฐ๋ค.
if (p.downCnt < height) {
p.downCnt++;
}
// ๋ค ๋ด๋ ค๊ฐ๋ค.
else {
// ๋ค ๋ด๋ ค๊ฐ ์ํ๋ก ๋ณ๊ฒฝ
p.status = C;
// ๋ค ๋ด๋ ค๊ฐ ์ฌ๋ 1 ์ฆ๊ฐ
++cCnt;
// ๊ณ๋จ ์์ ์ฌ๋ 1 ๊ฐ์
--ingCnt;
}
}
}
// ๋ชจ๋ ์ธ์์ด ๋ด๋ ค์จ ๊ฒฝ์ฐ
if (cCnt == size) {
break;
}
++time;
}
return time;
}
}
๐ค ๋์ ์๊ฐ
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ด๋ค.
๋ชจ๋ ์ฌ๋๋ค์ด ๊ณ๋จ์ ์ด์ฉํด ๋ด๋ ค๊ฐ๋ ๊ฐ์ฅ ์ต์๊ฐ ๋๋ ์๊ฐ์ ๊ตฌํ๋ ๊ฒ์ด๋ค.
์ฒ์์ ๊ณ๋จ์ ๊ฐ๊น์ด ์ฌ๋๋ค์ ํ๋ณํ๊ณ ๊ทธ๋ฆฌ๋ํ ๋ฐฉ๋ฒ์ผ๋ก ๊ณ์ ์๊ฐํ๋๋ฐ ์๊ฐํ๋ฉด ํ ์๋ก ๋ฐ๋ก๊ฐ ๋ง์ด ๋์๋ค.
๊ทธ๋์ ์ด์ฐจํผ ์ ์ฒด ์ฌ๋๋ 10๋ช
๊น์ง ๋ฐ์ ์๋๊ณ ๊ณ๋จ๋ 2๊ฐ๋ก ํ์ ๋์ด์๊ธฐ ๋๋ฌธ์ ์์ ํ์์ผ๋ก ์๊ฐํ๊ธฐ๋ก ํ๋ค.
๋ง์ฝ ์ฌ๋์ด 1,2,3 ์ธ๋ช
์ด ์๋ค๊ณ ์๊ฐํ๋ฉด ๊ณ๋จ 1,2์ ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๋ค์ด ๋์จ๋ค.
๊ณ๋จ 1 | ๊ณ๋จ 2 |
X | 1,2,3 |
1 | 2,3 |
2 | 1,3 |
3 | 1,2 |
1,2 | 3 |
1,3 | 2 |
2,3 | 1 |
1,2,3 | X |
์ด๊ฒ์ ๋ชจ๋ ๋ถ๋ถ์งํฉ์ ๊ตฌํ๋ ๊ณผ์ ์ด๋ค.
์๊ฐ ๋ณต์ก๋๋ O(2โฟ) -> 2^10 = 1024 ๋ฐ์ ๋์ง ์๋๋ค. ( ์ฌ๋์ด ์ต๋ 10๋ช
)
์ด์ ๊ณผ์ ์ ์๊ฐํด๋ณด๋ฉด
- ์ฌ๋๋ค์ ๋ ๊ณ๋จ์ ๋๋์ด ๋ฐฐ์ ( ๋ถ๋ถ์งํฉ )
- ๊ณ๋จ
- ๊ณ๋จ 1์ ๋ฐฐ์ ๋ ๋ชจ๋ ์ฌ๋์ ๋ํด ๊ณ๋จ ๋ด๋ ค๊ฐ๊ธฐ
- ๊ณ๋จ 2์ ๋ฐฐ์ ๋ ๋ชจ๋ ์ฌ๋์ ๋ํด ๊ณ๋จ ๋ด๋ ค๊ฐ๊ธฐ
- ๊ฐ์ฅ ๊ฐ๊น์ด ์ฌ๋ ๋ถํฐ ( ๊ฑฐ๋ฆฌ ์ค๋ฆ ์ฐจ์ ์ ๋ ฌ )
- ๊ณ๋จ ๋ด๋ ค๊ฐ ๋ ์ ์ฝ์ฌํญ
- ๊ณ๋จ ์ ๊ตฌ์์ 1๋ถ waiting
- 1๋ถ ์ง๋๋ฉด ๋ด๋ ค๊ฐ๊ธฐ ๊ฐ๋ฅ ( ๊ณ๋จ ์ด์ฉ์๊ฐ 3๋ช ๋ณด๋ค ์ ์ ๋ -> ๋๊ธฐํด์ผํ๋ ๊ฒฝ์ฐ๋ ๋ฐ์)
- ์์์๊ฐ์ ๊ณ๋จ 1์ ์ด ์๊ฐ๊ณผ ๊ณ๋จ 2์ ์ด ์๊ฐ ์ค ์ต๋๊ฐ์ผ๋ก ๋ํ๋ธ๋ค.์ด์ฐจํผ ๋์์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ต๋๊ฐ์ด์ฌ์ผ ๋ ๊ณ๋จ ์ชฝ ์ฌ๋๋ค์ด ๋ค ๋ด๋ ค์จ ๊ฒ์ด๋ค.