๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5-BEE6AK0DFAVl 

 

SW Expert Academy

SW ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์—ญ๋Ÿ‰ ๊ฐ•ํ™”์— ๋„์›€์ด ๋˜๋Š” ๋‹ค์–‘ํ•œ ํ•™์Šต ์ปจํ…์ธ ๋ฅผ ํ™•์ธํ•˜์„ธ์š”!

swexpertacademy.com


1. ๋ฌธ์ œ์š”์•ฝ

๋ชจ๋“  ์‚ฌ๋žŒ๋“ค์ด ๊ณ„๋‹จ์„ ๋‚ด๋ ค๊ฐ€ ์ด๋™ํ•˜๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.๊ณ„๋‹จ๊นŒ์ง€ ์ด๋™ํ•˜๋Š”์‹œ๊ฐ„ + ๊ณ„๋‹จ์„ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋Š” ์‹œ๊ฐ„ ์˜ ์ตœ์†Œ๊ฐ’์„ ๊ตฌํ•œ๋‹ค.์ œ์•ฝ์‚ฌํ•ญ์œผ๋กœ๋Š” ์ดˆ๋งˆ๋‹ค ๊ณ„๋‹จ์— 3๋ช…์ด ์žˆ์œผ๋ฉด 1์ดˆ ๋Œ€๊ธฐ ํ›„ ์ด๋™ํ•ด์•ผ ํ•œ๋‹ค.๊ณ„๋‹จ์€ ์ด 2๊ฐœ์ด๋ฉฐ, ๊ณ„๋‹จ์„ ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋Š” ์‹œ๊ฐ„์€ ๊ณ„๋‹จ์˜ ๊ธธ์ด์™€ ๋™์ผํ•˜๋‹ค.๊ณ„๋‹จ๊นŒ์ง€ ์ด๋™ํ•˜๋Š” ์‹œ๊ฐ„์€ ๋งจํ•˜ํƒ„๊ณต์‹์„ ์ด์šฉ

2. ํ’€์ด

๋ถ€๋ถ„์ง‘ํ•ฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์™„์ „ํƒ์ƒ‰์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ์กฐํ•ฉ์„ ๊ณ„์‚ฐํ–ˆ๋‹ค.1. ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ์‚ฌ๋žŒ๋งˆ๋‹ค ์‚ฌ์šฉํ•  ๊ณ„๋‹จ์„ ์„ ํƒํ•œ๋‹ค.

2. ๊ธฐ์ €์กฐ๊ฑด์—์„œ, ๊ฐ ๊ณ„๋‹จ์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์šฐ์„ ์ˆœ์œ„ํ์— ๋„ฃ๋Š”๋‹ค. ์ด ๋•Œ, ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์ˆœ์„œ๋กœ ์ •๋ ฌ๋œ๋‹ค.
    1) ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์‚ฌ๋žŒ๋ถ€ํ„ฐ ํ์—์„œ ๊บผ๋‚ด, ์‹œ์ž‘์‹œ๊ฐ„ ~ ๋„์ฐฉ์‹œ๊ฐ„ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ ค ๋Œ€๊ธฐ์ˆœ์„œ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ณ„์‚ฐํ•œ๋‹ค 

          ์‹œ์ž‘์‹œ๊ฐ„ : ๊ณ„๋‹จ ์ด๋™์‹œ๊ฐ„(๋งจํ•˜ํƒ„๊ฑฐ๋ฆฌ ๊ณต์‹) + 1(๋„์ฐฉ ํ›„ ๋Œ€๊ธฐ์‹œ๊ฐ„)  

          ๋„์ฐฉ์‹œ๊ฐ„ : ํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋Š”์‹œ๊ฐ„(๊ณ„๋‹จ์˜ ๊ธธ์ด)์„ ๊ณ„์‚ฐํ•œ๋‹ค.

          ๋Œ€๊ธฐ :  time[๋งค ์ดˆ] => ๋งค ์ดˆ์— ๊ณ„๋‹จ์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์ €์žฅ, 3์ด๋ฉด ๋„์ฐฉ์‹œ๊ฐ„+1 ํ•˜๊ณ  ๋‹ค์Œ์ดˆ๋ถ€ํ„ฐ ๊ณ„์‚ฐ(continue)

    2) 0๋ฒˆ ๊ณ„๋‹จ๊ณผ 1๋ฒˆ๊ณ„๋‹จ์˜ end ์ค‘ ํฐ ๊ฐ’์ด ์ตœ์ข…์‹œ๊ฐ„์ด ๋œ๋‹ค.

3. ๋ชจ๋“  ์กฐํ•ฉ์˜ ์ตœ์ข…์‹œ๊ฐ„ ์ค‘ ์ตœ์†Œ๊ฐ’์„ ์ฐพ๊ธฐ ์œ„ํ•ด min์„ ๊ฐฑ์‹ ํ•ด์ค€๋‹ค.

3. ์ฝ”๋“œ

๋”๋ณด๊ธฐ

import java.util.*;
import java.io.*;

public class SW_2383_์ ์‹ฌ์‹์‚ฌ์‹œ๊ฐ„ {

	static int N, perIdx, min;
	static int[][] map;
	static Stair[] stair;
	static Person[] per;
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = null;
		int T = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= T; tc++) {
			N = Integer.parseInt(br.readLine());
			
			map = new int[N][N];
			stair = new Stair[2];
			per = new Person[N*N];
			int idx = 0; //๊ณ„๋‹จ๋ฒˆํ˜ธ 0,1
			perIdx = 0;
			
			for (int i = 0; i < N; i++) {
				st = new StringTokenizer(br.readLine());
				for (int j = 0; j < N; j++) {
					map[i][j] = Integer.parseInt(st.nextToken());
					if (map[i][j] == 1) { //์‚ฌ๋žŒ์ด๋ฉด ์ขŒํ‘œ์ €์žฅ
						per[perIdx++] = new Person(i, j);
					}
					if (map[i][j] >= 2) { //๊ณ„๋‹จ๊ธธ์ด
						stair[idx++] = new Stair(i, j,map[i][j] ); //i:๊ณ„๋‹จy์ขŒํ‘œ,j:๊ณ„๋‹จx์ขŒํ‘œ,len:๊ณ„๋‹จ๊ธธ์ด
					}
				}
			}
			min = Integer.MAX_VALUE;
			subset(0);
			System.out.println("#"+tc+" "+min);
		}
	}

	static void subset(int cnt) {
		if (cnt == perIdx) { //๊ฐ์ž ๊ณ„๋‹จ ์„ ํƒ ์™„๋ฃŒ => ์ด์ œ ์‹œ๊ฐ„ ์ตœ์†Œ๊ฐ’์„ ์ฐพ์ž
			int totalTime = 0;
			for (int i = 0; i < 2; i++) {
				//1. ์šฐ์„ ์ˆœ์œ„ ํ์— ํ•ด๋‹น ๊ณ„๋‹จ์ธ ์‚ฌ๋žŒ๋“ค๋งŒ ๊ฐ€๊นŒ์šด ์ˆœ์œผ๋กœ ๋„ฃ์–ด์คŒ
				PriorityQueue<Person> pq = new PriorityQueue<> ();
				int time[] = new int[100]; // ๋งค ์ดˆ๋งˆ๋‹ค ์‚ฌ๋žŒ ์ˆ˜ ์ €์žฅ
				
				for (int j = 0; j < perIdx; j++) {
					if (per[j].stair == i) {
						pq.add(per[j]); //์ €์žฅํ•˜๋ฉด ํ•ด๋‹น ๊ณ„๋‹จ๊ณผ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ์‚ฌ๋žŒ ์ˆœ์œผ๋กœ ์ •๋ ฌ๋จ
					}
				}

				//2. ๊ฐ€๊นŒ์šด์ˆœ์„œ๋ถ€ํ„ฐ ๊ณ„๋‹จํƒ€๊ณ  ๋‚ด๋ ค๊ฐ€๋Š” ์‹œ๊ฐ„ ๊ณ„์‚ฐ
				while (!pq.isEmpty()) {
					Person front = pq.poll();
					int start = front.moveTime; //๊ณ„๋‹จ๊นŒ์ง€ ์ด๋™๊ฑฐ๋ฆฌ(=์ด๋™์‹œ๊ฐ„)
					int end = start+stair[i].len; //๊ณ„๋‹จ ๋‹ค๋‚ด๋ ค๊ฐ„ ์‹œ๊ฐ„
					for (int j = start; j < end; j++) {
						if (time[j] == 3) {
							end++;
							continue;
						}
						time[j]++;
					}
					totalTime = Math.max(totalTime, end); //์ตœ์ข…์‹œ๊ฐ„์€ end์˜ ๋งˆ์ง€๋ง‰ ๊ฐ’, 0๊ณ„๋‹จ end์™€ 1๊ณ„๋‹จend ์ค‘ ํฐ๊ฒŒ ์ตœ์ข…์‹œ๊ฐ„์ž„
				}
			}
			min = Math.min(totalTime, min); //๊ฐ ์กฐํ•ฉ๋“ค์˜ ๊ฑธ๋ฆฐ์‹œ๊ฐ„ ์ค‘ ์ตœ์†Œ์‹œ๊ฐ„์„ ์ฐพ์Œ
			return;
		}
		
		//1๋ฒˆ๊ณ„๋‹จ ์„ ํƒ
		per[cnt].stair=0;
		per[cnt].moveTime = 1 + Math.abs( per[cnt].y-stair[0].y ) + Math.abs( per[cnt].x-stair[0].x );
		subset(cnt+1);
		//2๋ฒˆ๊ณ„๋‹จ ์„ ํƒ
		per[cnt].stair=1;
		per[cnt].moveTime = 1 + Math.abs( per[cnt].y-stair[1].y ) + Math.abs( per[cnt].x-stair[1].x );
		subset(cnt+1);
	}
	
	static class Person implements Comparable<Person>{
		int y, x, moveTime, stair; //dist:๊ณ„๋‹จ๊ณผ์˜๊ฑฐ๋ฆฌ, t:์„ ํƒํ•œ ๊ณ„๋‹จ
		public Person(int y, int x) { 
			this.y = y;
			this.x = x;
		}
		@Override
		public int compareTo(Person o) {
			return this.moveTime - o.moveTime; //d์ž‘์€์ˆœ์œผ๋กœ ์ •๋ ฌ
		}
	}
	static class Stair {
		int y, x, len;
		public Stair(int y, int x, int len) {
			this.y = y;
			this.x = x;
			this.len = len;
		}
	}
}