๐Ÿš•๋ฐฑ์ค€ : ์Šคํƒ€ํŠธ ํƒ์‹œ

๊ธ๊ธยท2025๋…„ 10์›” 15์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
22/31

๐Ÿ”‘๋ฌธ์ œ

19238๋ฒˆ: ์Šคํƒ€ํŠธ ํƒ์‹œ
Lv : ๊ณจ๋“œ 2

๐Ÿ”‘๋ฌธ์ œ ํ’€์ด ํ๋ฆ„

1. ํƒ์‹œ ์œ„์น˜, ์†๋‹˜ ์œ„์น˜ ์ €์žฅํ•˜๊ธฐ

1) ํƒ์‹œ ์œ„์น˜
ํƒ์‹œ ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ฐฐ์—ด๋กœ ์ €์žฅํ•œ๋‹ค.

static int[] taxi;
// ํƒ์‹œ ์‹œ์ž‘ ์œ„์น˜
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
taxi = new int[] { x - 1, y - 1 };

2) ์†๋‹˜ ์œ„์น˜

  • Customer ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์ถœ๋ฐœ์ง€์™€ ๋ชฉ์ ์ง€๋ฅผ ์ €์žฅ
  • customers ๋ฆฌ์ŠคํŠธ์— ๊ฐ์ฒด๋ฅผ ์ €์žฅ
//๊ฐ์ฒด ์ƒ์„ฑ
class Customer {
	int[] depart; //์ถœ๋ฐœ์ง€์  
	int[] dest; //๋„์ฐฉ์ง€์ 
	int path; //๊ฑฐ๋ฆฌ ์ €์žฅ
	boolean arrived; //์™„๋ฃŒํ•œ ์†๋‹˜์ธ์ง€

	public Customer(int[] depart, int[] dest, int path, boolean arrived) {
		super();
		this.depart = depart;
		this.dest = dest;
		this.path = path;
		this.arrived = arrived;
	}
}

		// ์†๋‹˜์˜ ์œ„์น˜ ๋ฐฐ์—ด
		customers = new ArrayList<>(M);

		for (int i = 0; i < M; i++) {
			st = new StringTokenizer(br.readLine());
			int x1 = Integer.parseInt(st.nextToken());
			int y1 = Integer.parseInt(st.nextToken());
			int x2 = Integer.parseInt(st.nextToken());
			int y2 = Integer.parseInt(st.nextToken());

			Customer cus = new Customer(new int[] { x1 - 1, y1 - 1 }, new int[] { x2 - 1, y2 -1 }, 0, false);
			customers.add(cus);

		}

2. ์†๋‹˜์˜ ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•˜์—ฌ ์ด๋™

ํ•œ ์‚ฌ์ดํด์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •:

  • ์ด๋ฒˆ์— ํƒœ์šธ ์†๋‹˜ ์„ ํƒ (choose)
  • ํƒ์‹œ ์œ„์น˜์—์„œ ์Šน๊ฐ ์œ„์น˜๊นŒ์ง€ ์ด๋™ (pickUp)
  • ์Šน๊ฐ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ (dropDown)

end ๋ณ€์ˆ˜: ์—ฐ๋ฃŒ ๋ถ€์กฑ์ด๋‚˜ ๋„๋‹ฌ ๋ถˆ๊ฐ€ ์‹œ ๋ฐ˜๋ณต ์ข…๋ฃŒ ๋ฐ -1 ์ถœ๋ ฅ ์ฒ˜๋ฆฌ

		for (int i = 0; i < M; i++) {
			end = false; // ์ดˆ๊ธฐํ™”
			// 1) ์ด๋ฒˆ์— ํ”ฝ์—…ํ•  ์†๋‹˜์„ ๊ณ ๋ฅด๋Š” ๋ฉ”์„œ๋“œ
			int custIdx = choose();
			if (end) {
				break;
			}
//			 2) ์†๋‹˜ ํ”ฝ์—…ํ•˜๊ธฐ
			pickUp(custIdx);
			if (end) {
				break;
			}
//			// ์†๋‹˜์„ ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™ํ•˜๊ธฐ.
			dropDown(custIdx);
			if (end) {
				break;
			}
		}

3. choose : ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šน๊ฐ ์„ ํƒ

  • ๊ฑฐ๋ฆฌ ๊ธฐ์ค€์œผ๋กœ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์Šน๊ฐ ์„ ํƒ
  • ๊ฑฐ๋ฆฌ ๊ฐ™์œผ๋ฉด ํ–‰ ๋ฒˆํ˜ธ, ๊ฐ™์œผ๋ฉด ์—ด ๋ฒˆํ˜ธ ์ˆœ์œผ๋กœ ๊ฒฐ์ •
  • BFS๋กœ ๊ฐ ์Šน๊ฐ๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ
	private static int choose() {
    //๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์†๋‹˜์„ ํ”ฝ์—…ํ•ด์•ผ ํ•œ๋‹ค. 
		minPath = Integer.MAX_VALUE;
		minIdx = -1;
		// ๊ฐ์ฒด๋ฅผ ๋Œ๊ธฐ
		for (int i = 0; i < M; i++) {
			Customer cus = customers.get(i);

			if (cus.arrived) { // ์ด๋ฏธ ์ฒ˜๋ฆฌํ•œ ์†๋‹˜์ด๋ฉด pass
				continue;
			}
			int p = distance(taxi[0], taxi[1], cus.depart[0], cus.depart[1]); // ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๊ธฐ
			if (p == -1) continue; 
			if (p < minPath) {
				minPath = p;
				minRow = cus.depart[0];
				minCol = cus.depart[1];
				minIdx = i;
			} else if (p == minPath) {
			    if (cus.depart[0] < minRow || (cus.depart[0] == minRow && cus.depart[1] < minCol)) {
			        minRow = cus.depart[0];
			        minCol = cus.depart[1];
			        minIdx = i;
			    }
			}
		}
		//๋ชจ๋“  ์†๋‹˜ ์ ‘๊ทผ ๋ถˆ๊ฐ€
		if( minIdx == -1) {
			end = true;
			return -1;
		}
		// ์†๋‹˜์„ ํƒœ์šด ๊ฑฐ ์ฒ˜๋ฆฌํ•˜๊ธฐ
		customers.get(minIdx).arrived = true;

		return minIdx;
	}

4. pickUp : ์†๋‹˜ ํ”ฝ์—…

  • ํƒ์‹œ -> ์Šน๊ฐ ์ถœ๋ฐœ์ง€ ์ด๋™
  • ์—ฐ๋ฃŒ ์†Œ๋ชจ ๋ฐ˜์˜, ํƒ์‹œ ์œ„์น˜ ์—…๋ฐ์ดํŠธ
  • ๋„๋‹ฌ ๋ถˆ๊ฐ€ ๋˜๋Š” ์—ฐ๋ฃŒ ๋ถ€์กฑ ์‹œ end = true ์ฒ˜๋ฆฌ
	private static void pickUp(int custIdx) {

		int targetPath = 0;
		int targetX = 0;
		int targetY = 0;

		// ํƒ์‹œ ์œ„์น˜์—์„œ ์†๋‹˜ depart๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ
		targetX = customers.get(custIdx).depart[0];
		targetY = customers.get(custIdx).depart[1];

		targetPath = distance(taxi[0], taxi[1], targetX, targetY);

		//distance๊ฐ€ -1๋กœ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๋„ end๊ฐ€ ๋˜๋„๋ก ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ
		if (targetPath == -1 || oil - targetPath < 0) {
		    end = true;
		    return;
		}
		oil -= targetPath;
		taxi[0] = targetX;
		taxi[1] = targetY;
	}

5. dropDown : ๋ชฉ์ ์ง€๊นŒ์ง€ ์ด๋™

  • ์Šน๊ฐ ์ถœ๋ฐœ์ง€ -> ๋ชฉ์ ์ง€ ์ด๋™
  • ์ด๋™ ๊ฑฐ๋ฆฌ๋งŒํผ ์—ฐ๋ฃŒ ์†Œ๋ชจ, ๋„์ฐฉ ์‹œ ์—ฐ๋ฃŒ 2๋ฐฐ ์ถฉ์ „
  • ์—ฐ๋ฃŒ ๋ถ€์กฑ ์‹œ end = true ์ฒ˜๋ฆฌ
	private static void dropDown(int custIdx) {

		int departX = customers.get(custIdx).depart[0];
		int departY = customers.get(custIdx).depart[1];

		int destX = customers.get(custIdx).dest[0];
		int destY = customers.get(custIdx).dest[1];

		int dist = distance(taxi[0], taxi[1], destX, destY);
		if (dist == -1 || oil - dist < 0) { // ๋„๋‹ฌ ๋ถˆ๊ฐ€ ๋˜๋Š” ์—ฐ๋ฃŒ ๋ถ€์กฑ
		    end = true;
		    return;
		}
		oil = oil - dist + dist * 2;
		taxi[0] = destX;
		taxi[1] = destY;

	}

6. distance : ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ

dfs๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ

	private static int distance(int startX, int startY, int targetX, int targetY) {
	    boolean[][] visited = new boolean[N][N];
	    Queue<int[]> q = new LinkedList<>();
	    q.offer(new int[]{startX, startY, 0}); // {x, y, depth}
	    visited[startX][startY] = true;

	    while (!q.isEmpty()) {
	        int[] cur = q.poll();
	        int x = cur[0];
	        int y = cur[1];
	        int d = cur[2];

	        // ๋ชฉ์ ์ง€ ๋„์ฐฉ
	        if (x == targetX && y == targetY) {
	            return d;
	        }
	        for (int k = 0; k < 4; k++) {
	            int nx = x + di[k];
	            int ny = y + dj[k];

	            if (nx >= 0 && nx < N && ny >= 0 && ny < N && map[nx][ny] == 0 && !visited[nx][ny]) {
	                visited[nx][ny] = true;
	                q.offer(new int[]{nx, ny, d + 1});
	            }
	        }
	    }
	    // ๋„๋‹ฌ ๋ถˆ๊ฐ€
	    return -1;
	}

๐Ÿ”‘ํšŒ๊ณ 

์ด ๋ฌธ์ œ์—์„œ ๊ฐ€์žฅ ๊นŒ๋‹ค๋กœ์› ๋˜ ์ ์€ ๋„๋‹ฌ ๋ถˆ๊ฐ€์˜ ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.
์ƒ์„ฑํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์—์„œ ๋„๋‹ฌ์ด ๋ถˆ๊ฐ€ํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ–ˆ๊ณ , ๋†“์น˜๋Š” ๋ถ€๋ถ„๋„ ๋งŽ์•˜๋‹ค.

์ด๋Ÿฐ ์กฐ๊ฑด์„ ๊ผผ๊ผผํ•˜๊ฒŒ ๊ฒ€ํ† ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ๊ฒ ๋‹ค...

0๊ฐœ์˜ ๋Œ“๊ธ€