4 ๋ถ„ ์†Œ์š”

๐Ÿ“ [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์˜ ์ด ์‹œ๊ฐ„ ์ค‘ ์ตœ๋Œ€๊ฐ’์œผ๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค.์–ด์ฐจํ”ผ ๋™์‹œ์— ๊ฐ€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ๋Œ€๊ฐ’์ด์—ฌ์•ผ ๋‘ ๊ณ„๋‹จ ์ชฝ ์‚ฌ๋žŒ๋“ค์ด ๋‹ค ๋‚ด๋ ค์˜จ ๊ฒƒ์ด๋‹ค.