https://www.acmicpc.net/problem/9205

 

9205๋ฒˆ: ๋งฅ์ฃผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ

์†ก๋„์— ์‚ฌ๋Š” ์ƒ๊ทผ์ด์™€ ์นœ๊ตฌ๋“ค์€ ์†ก๋„์—์„œ ์—ด๋ฆฌ๋Š” ํŽœํƒ€ํฌํŠธ ๋ฝ ํŽ˜์Šคํ‹ฐ๋ฒŒ์— ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ์˜ฌํ•ด๋Š” ๋งฅ์ฃผ๋ฅผ ๋งˆ์‹œ๋ฉด์„œ ๊ฑธ์–ด๊ฐ€๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ถœ๋ฐœ์€ ์ƒ๊ทผ์ด๋„ค ์ง‘์—์„œ ํ•˜๊ณ , ๋งฅ์ฃผ ํ•œ ๋ฐ•์Šค๋ฅผ ๋“ค๊ณ  ์ถœ๋ฐœํ•œ๋‹ค.

www.acmicpc.net

 

 

 

 

 

๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ ๋ฌธ์ œ์ด๋‹ค. ์ฒ˜์Œ์—๋Š” ์ž…๋ ฅ์—์„œ ์ฃผ์–ด์ง„ ์ขŒํ‘œ๋กœ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๋กœ ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค์–ด์„œ ํƒ์ƒ‰์„ ๋Œ๋ ค์•ผ ํ•˜๋‚˜ ์ƒ๊ฐํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ขŒํ‘œ ์ž์ฒด๋ฅผ ํ•œ ์ •์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ณ  ์ •์  ๊ฐ„ ํƒ์ƒ‰์„ ํ•ด์ฃผ๋ฉด ๋์—ˆ๋‹ค.

 

0. ์ž…๋ ฅ๋ฐ›์„ ๋•Œ ํŽธ์˜์ ์˜ ์ขŒํ‘œ๋ฅผ Dot์ด๋ผ๋Š” ๊ฐ์ฒด ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

1. ์ƒ๊ทผ์ด๋„ค ์ง‘์„ ์‹œ์ž‘์œผ๋กœ BFS ํƒ์ƒ‰์„ ํ•œ๋‹ค.

2. ๋ฝํŽ˜์— ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌ๋ฅผ ํ•œ๋‹ค.(๋งจํ•˜ํƒ„ ๊ฑฐ๋ฆฌ๊ฐ€ 1000์ดํ•˜์—ฌ์•ผ ํ•œ๋‹ค.) ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋ฐ”๋กœ TRUE๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

3. ๋ชจ๋“  ํŽธ์˜์ ์— ๋Œ€ํ•ด ํƒ์ƒ‰์„ ํ•œ๋‹ค.

4. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ , 20๋ณ‘ ์•ˆ์— ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด(๋งจํ•˜ํƒ„ ๊ฑฐ๋ฆฌ๊ฐ€ 1000์ดํ•˜์ด๋ฉด) ํ์— ๋„ฃ์–ด์ฃผ๊ณ  ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ•ด์ค€๋‹ค.

5. ํ๊ฐ€ ๋นŒ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•œ๋‹ค.

6. ์ค‘๊ฐ„์— ๋ฆฌํ„ด๋˜์ง€ ์•Š๊ณ  ๋๋‚ฌ๋‹ค๋ฉด ๋ฝํŽ˜์— ๋„์ฐฉ ๋ชปํ•œ ๊ฒƒ์ด๋‹ค.

 

 

 

 

 

์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
	static int n;
	static Dot[] stores;
	static boolean[] visited;
	
	static class Dot {
		int x, y;

		public Dot(int x, int y) {
			this.x = x;
			this.y = y;
		}
	}

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		int T = Integer.parseInt(br.readLine()); //ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜
		
		StringBuilder sb = new StringBuilder();
		for(int t = 0; t < T; t++) { 
			n = Integer.parseInt(br.readLine()); //ํŽธ์˜์ ์˜ ๊ฐœ์ˆ˜
			
			//์ƒ๊ทผ์ด๋„ค ์ง‘ ์ขŒํ‘œ
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			int hx = Integer.parseInt(st.nextToken());
			int hy = Integer.parseInt(st.nextToken());
			
			stores = new Dot[n];
			
			//ํŽธ์˜์  ์ขŒํ‘œ
			for(int i = 0; i < n; i++) {
				st = new StringTokenizer(br.readLine(), " ");
				int cx = Integer.parseInt(st.nextToken());
				int cy = Integer.parseInt(st.nextToken());
				
				//๋ฐฐ์—ด์— ๋‹ด๊ธฐ
				stores[i] = new Dot(cx, cy);
			}
			
			//๋ฝํŽ˜ ์ขŒํ‘œ
			st = new StringTokenizer(br.readLine(), " ");
			int fx = Integer.parseInt(st.nextToken());
			int fy = Integer.parseInt(st.nextToken());

			//๊ตฌํ˜„
			visited = new boolean[n];
			
			if(bfs(hx, hy, fx, fy)) { //ํ–‰๋ณตํ•˜๊ฒŒ ํŽ˜์Šคํ‹ฐ๋ฒŒ์— ๊ฐˆ ์ˆ˜ ์žˆ์Œ
				sb.append("happy\n");
			}else {
				sb.append("sad\n");
			}
		}
		
		System.out.println(sb);
	}

	public static boolean bfs(int hx, int hy, int fx, int fy) {
		Queue<Dot> queue = new LinkedList<>();
		
		queue.add(new Dot(hx, hy)); //์‹œ์ž‘์ 
		
		while(!queue.isEmpty()) {
			Dot dot = queue.poll();
			
			int dist = getDistance(dot.x, dot.y, fx, fy);
			
			if(dist <= 1000) { //๋ฝํŽ˜๊นŒ์ง€ ๋„์ฐฉ ๊ฐ€๋Šฅ
				return true;
			}
			
			for(int i = 0; i < n; i++) { //๋ชจ๋“  ํŽธ์˜์ ์— ๋Œ€ํ•ด ํƒ์ƒ‰
				if(!visited[i]) { //๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๊ณ 
					int nx = stores[i].x;
					int ny = stores[i].y;
					
					dist = getDistance(dot.x, dot.y, nx, ny);
					
					if(dist <= 1000) { //20๋ณ‘ ์•ˆ์— ๊ฐˆ ์ˆ˜ ์žˆ์œผ๋ฉด
						queue.add(new Dot(nx, ny));
						visited[i] = true;
					}
				}
			}
		}
		return false;
	}

	public static int getDistance(int x1, int y1, int x2, int y2) {
		return Math.abs(x2 - x1) + Math.abs(y2 - y1);
	}

}

 

 

 

 

 

 

๊ฒฐ๊ณผ

giraffe_