ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [์‚ผ์„ฑSWํ…Œ์ŠคํŠธ] ์•„๊ธฐ ์ƒ์–ด JAVA
    STUDY ๐Ÿ’›/์•Œ๊ณ ๋ฆฌ์ฆ˜ 2021. 2. 17. 17:15
    ๋ฐ˜์‘ํ˜•

     

    [๋ฌธ์ œ]

    www.acmicpc.net/problem/16236

     

    16236๋ฒˆ: ์•„๊ธฐ ์ƒ์–ด

    N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค. ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€

    www.acmicpc.net

    N×N ํฌ๊ธฐ์˜ ๊ณต๊ฐ„์— ๋ฌผ๊ณ ๊ธฐ M๋งˆ๋ฆฌ์™€ ์•„๊ธฐ ์ƒ์–ด 1๋งˆ๋ฆฌ๊ฐ€ ์žˆ๋‹ค. ๊ณต๊ฐ„์€ 1×1 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์—๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์ตœ๋Œ€ 1๋งˆ๋ฆฌ ์กด์žฌํ•œ๋‹ค.
    ์•„๊ธฐ ์ƒ์–ด์™€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋ชจ๋‘ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์ด ํฌ๊ธฐ๋Š” ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ฐ€์žฅ ์ฒ˜์Œ์— ์•„๊ธฐ ์ƒ์–ด์˜ ํฌ๊ธฐ๋Š” 2์ด๊ณ , ์•„๊ธฐ ์ƒ์–ด๋Š” 1์ดˆ์— ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ํ•œ ์นธ์”ฉ ์ด๋™ํ•œ๋‹ค.
    ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ํฐ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ณ , ๋‚˜๋จธ์ง€ ์นธ์€ ๋ชจ๋‘ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์€ ๋ฌผ๊ณ ๊ธฐ๋งŒ ๋จน์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ, ํฌ๊ธฐ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๋Š” ๋จน์„ ์ˆ˜ ์—†์ง€๋งŒ, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์€ ์ง€๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

    ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์–ด๋””๋กœ ์ด๋™ํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    - ๋” ์ด์ƒ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๊ณต๊ฐ„์— ์—†๋‹ค๋ฉด ์•„๊ธฐ ์ƒ์–ด๋Š” ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•œ๋‹ค.
    - ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ผ๋ฉด, ๊ทธ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
    - ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ 1๋งˆ๋ฆฌ๋ณด๋‹ค ๋งŽ๋‹ค๋ฉด, ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋Ÿฌ ๊ฐ„๋‹ค.
    - ๊ฑฐ๋ฆฌ๋Š” ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์žˆ๋Š” ์นธ์—์„œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์ง€๋‚˜์•ผํ•˜๋Š” ์นธ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์ด๋‹ค.
    - ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ๋‹ค๋ฉด, ๊ฐ€์žฅ ์œ„์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ, ๊ทธ๋Ÿฌํ•œ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋งˆ๋ฆฌ๋ผ๋ฉด,
    ๊ฐ€์žฅ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค.

    ์•„๊ธฐ ์ƒ์–ด์˜ ์ด๋™์€ 1์ดˆ ๊ฑธ๋ฆฌ๊ณ , ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฆ‰, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋จน์„ ์ˆ˜ ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์žˆ๋Š” ์นธ์œผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋ฉด, ์ด๋™๊ณผ ๋™์‹œ์— ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน๋Š”๋‹ค. ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์œผ๋ฉด, ๊ทธ ์นธ์€ ๋นˆ ์นธ์ด ๋œ๋‹ค.
    ์•„๊ธฐ ์ƒ์–ด๋Š” ์ž์‹ ์˜ ํฌ๊ธฐ์™€ ๊ฐ™์€ ์ˆ˜์˜ ๋ฌผ๊ณ ๊ธฐ๋ฅผ ๋จน์„ ๋•Œ ๋งˆ๋‹ค ํฌ๊ธฐ๊ฐ€ 1 ์ฆ๊ฐ€ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๊ธฐ๊ฐ€ 2์ธ ์•„๊ธฐ ์ƒ์–ด๋Š” ๋ฌผ๊ณ ๊ธฐ๋ฅผ 2๋งˆ๋ฆฌ ๋จน์œผ๋ฉด ํฌ๊ธฐ๊ฐ€ 3์ด ๋œ๋‹ค.
    ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ๋ช‡ ์ดˆ ๋™์•ˆ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

     

    [์ž…๋ ฅ]

    ์ฒซ์งธ ์ค„์— ๊ณต๊ฐ„์˜ ํฌ๊ธฐ N(2 ≤ N ≤ 20)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์— ๊ณต๊ฐ„์˜ ์ƒํƒœ๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ณต๊ฐ„์˜ ์ƒํƒœ๋Š” 0, 1, 2, 3, 4, 5, 6, 9๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์•„๋ž˜์™€ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„๋‹ค.

    - 0: ๋นˆ ์นธ
    - 1, 2, 3, 4, 5, 6: ์นธ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ํฌ๊ธฐ
    - 9: ์•„๊ธฐ ์ƒ์–ด์˜ ์œ„์น˜

    [์ถœ๋ ฅ]

    ์ฒซ์งธ ์ค„์— ์•„๊ธฐ ์ƒ์–ด๊ฐ€ ์—„๋งˆ ์ƒ์–ด์—๊ฒŒ ๋„์›€์„ ์š”์ฒญํ•˜์ง€ ์•Š๊ณ  ๋ฌผ๊ณ ๊ธฐ๋ฅผ ์žก์•„๋จน์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.

     

    [Solution]

    package boj16236_์•„๊ธฐ์ƒ์–ด;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class Main {
    	static class Point {
    		int r, c, dist;
    		
    		public Point(int r, int c, int dist) {
    			this.r = r;
    			this.c = c;
    			this.dist = dist;
    		}
    	}
    	
    	static int n;
    	static int[][] map;
    	static int answer, eatCnt;
    	static int sr, sc;
    	
    	static int[] dx = {0, -1, 0, 1};
    	static int[] dy = {1, 0, -1, 0};
    			
    	static ArrayList<Point> fish;
    	
    	public static void main(String[] args) throws IOException {
    		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    		StringTokenizer st = new StringTokenizer(br.readLine());
    		
    		n = Integer.parseInt(st.nextToken());
    		
    		map = new int[n][n];
    		int babySharkState = 2;
    		
    		for(int i=0; i<n; ++i) {
    			st = new StringTokenizer(br.readLine());
    			for(int j=0; j<n; ++j) {
    				//0 : ๋นˆ์นธ
    				//1,2,3,4,5,6 : ์นธ์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ์˜ ํฌ๊ธฐ
    				//9 : ์•„๊ธฐ์ƒ์–ด์˜ ์œ„์น˜
    				map[i][j] = Integer.parseInt(st.nextToken());
    				
    				if(map[i][j] == 9) {
    					//์•„๊ธฐ์ƒ์–ด์˜ ์œ„์น˜ (i,j)
    					sr = i;
    					sc = j;
    					map[i][j] = 0;
    				}
    			}
    		}
    		
    		while(true) {
    			Queue<Point> bfs = new LinkedList<>();
    			
    			fish = new ArrayList<>();			//๋จน์ด ๋ฌผ๊ณ ๊ธฐ ๋ฆฌ์ŠคํŠธ
    			boolean visited[][] = new boolean[n][n];
    			
    			bfs.add(new Point(sr, sc, 0));
    			visited[sr][sc] = true;
    			
    			//BFS
    			while(!bfs.isEmpty()) {
    				Point babyShark = bfs.poll();
    				
    				//์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰
    				for(int i=0; i<4; ++i) {
    					int nr = babyShark.r + dy[i];
    					int nc = babyShark.c + dx[i];
    					
    					if(nr<0 || nr>=n || nc<0 || nc>=n) continue;			//์ขŒํ‘œ ๋ฒ”์œ„ ๋ฒ—์–ด๋‚˜๋ฉด ๋‹ค๋ฅธ์ขŒํ‘œ ํƒ์ƒ‰
    					if(visited[nr][nc]) continue;							//๋ฐฉ๋ฌธํ•œ ์ขŒํ‘œ๋Š” ์ง€๋‚˜๊ฐ€๊ธฐ
    					
    					//๋จน์ด๋ฅผ ์ฐพ์œผ๋ฉด(๋จน์ด๋Š” 1~6๊นŒ์ง€)
    					//์•„๊ธฐ์ƒ์–ด ํฌ๊ธฐ๋ณด๋‹ค ์ž‘์œผ๋ฉด ๋จน์„์ˆ˜์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ
    					if (1 <= map[nr][nc] && map[nr][nc] <= 6 && map[nr][nc] < babySharkState) {
    						bfs.offer(new Point(nr, nc, babyShark.dist + 1));		//์ƒ์–ด์˜ ์œ„์น˜ ๊ฐฑ์‹ , ํ•œ์นธ ์ด๋™ํ–ˆ์œผ๋ฏ€๋กœ ๊ฑฐ๋ฆฌ+1
    						fish.add(new Point(nr, nc, babyShark.dist + 1));		//๋จน์ด ๋ฆฌ์ŠคํŠธ์— ์‚ฝ์ž…
    						visited[nr][nc] = true; //๋ฐฉ๋ฌธ ํ‘œ์‹œ
    					}
    					
    					else if(map[nr][nc] == babySharkState || map[nr][nc] == 0) {
    						bfs.offer(new Point(nr, nc, babyShark.dist + 1));		//์ƒ์–ด ์œ„์น˜ ๊ฐฑ์‹ , ํ•œ์นธ ์ด๋™ํ–ˆ์œผ๋ฏ€๋กœ ๊ฑฐ๋ฆฌ+1
    						visited[nr][nc] = true;									//๋ฐฉ๋ฌธ ํ‘œ์‹œ
    					}
    				}
    			}
    			
    			//๋จน์ด ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—†์Œ
    			if(fish.size() == 0) break;
    			
    			//๋จน์ด๋ฌผ๊ณ ๊ธฐ๊ฐ€ ์—ฌ๋Ÿฌ๋งˆ๋ฆฌ๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋ฌผ๊ณ ๊ธฐ ์ฐพ์•„์„œ ๋จน๊ธฐ
    			Point eat = fish.get(0);
    			
    			for(int i=1; i<fish.size(); ++i) {
    				//๊ฐ€์žฅ ๊ฐ€๊นŒ์ด ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ ์ฐพ์•„์„œ ๋จน๊ธฐ
    				if(eat.dist > fish.get(i).dist) {
    					eat = fish.get(i);
    				}
    				
    				//๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๊ฐ€์žฅ ์œ„์—์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ ๋จน๊ธฐ(r์ด ๊ฐ€์žฅ ์ž‘์€)
    				//๊ฐ€์žฅ์ž‘์€ r์œ„์น˜์— ์žˆ๋Š” ๋ฌผ๊ณ ๊ธฐ๊ฐ€ ๋งŽ์œผ๋ฉด ๊ฐ€์žฅ ์™ผ์ชฝ๋ถ€ํ„ฐ (c๊ฐ€ ๊ฐ€์žฅ ์ž‘์€)
    				if(eat.dist == fish.get(i).dist) {
    					if(eat.r > fish.get(i).r) {
    						eat = fish.get(i);
    					}
    				}
    			}
    			
    			answer += eat.dist;			//๋จน์€ ๋ฌผ๊ณ ๊ธฐ ๊ฑฐ๋ฆฌ๋งŒํผ ์‹œ๊ฐ„ ์ง€๋‚จ(1์นธ์ด๋™์— 1h)
    			eatCnt++;					//๋จน์€ ๋ฌผ๊ณ ๊ธฐ cnt+1
    			map[eat.r][eat.c] = 0;		//๋ฌผ๊ณ ๊ธฐ ๋จน์—ˆ์œผ๋‹ˆ ์—†์• ๊ธฐ
    			
    			//๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜๊ฐ€ ์•„๊ธฐ์ƒ์–ด ํฌ๊ธฐ๋ž‘ ๊ฐ™์•„์ง€๋ฉด
    			if(eatCnt == babySharkState) {
    				//์•„๊ธฐ์ƒ์–ด ํฌ๊ธฐ ์ฆ๊ฐ€, ๋จน์€ ๋ฌผ๊ณ ๊ธฐ ์ˆ˜ ์ดˆ๊ธฐํ™”
    				babySharkState++;
    				eatCnt = 0;
    			}
    			
    			//์•„๊ธฐ์ƒ์–ด ์ขŒํ‘œ ์ด๋™
    			sr = eat.r;
    			sc = eat.c;
    		}
    
    		System.out.println(answer);
    	}
    }
    ๋ฐ˜์‘ํ˜•
Designed by Tistory.