๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 22352_ํ•ญ์ฒด ์ธ์‹

๋ฟŒ์•ผ._. 2023. 3. 20. 00:12

Gold V

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/22352)

< ํ•ญ์ฒด ์ธ์‹ >

 

๋ฌธ์ œ ํ’€์ด

 

๋ฐฑ์‹ ์„ ๋†“๊ธฐ ์ „๊ณผ ๋†“์€ ๋’ค์˜ ์ดฌ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ๊ณณ์„ ๋จผ์ € ์ฐพ์•„ ๋ฐฐ์—ด์— ์ €์žฅํ•ด ๋‘ก๋‹ˆ๋‹ค. 

๊ทธ ํ›„์— ๋ณ€ํ™”ํ•œ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ bfs๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ•ญ์ฒด๊ฐ€ ํผ์ง„ ๊ณณ์ธ์ง€ ์ฐพ์•„ ์ค๋‹ˆ๋‹ค.

bfs๋กœ ์ฃผ๋ณ€์„ ๋‹ค ํƒ์ƒ‰ํ•œ ํ›„์—๋„ ๋ณ€ํ™”ํ•œ ๊ฐ’์ด ์กด์žฌํ•œ๋‹ค๋ฉด ๋งž์€ ๋ฐฑ์‹ ์ด CPCU-1202๊ฐ€ ์•„๋‹ˆ๋ฏ€๋กœ "NO"๋ฅผ ์ถœ๋ ฅํ•˜๊ณ ,

๋‹ค ํƒ์ƒ‰ํ•œ ํ›„์— ๋ณ€ํ™”ํ•œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด "YES"๋ฅผ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

 

 

 

 - my solution (Java)

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 _22352_ { // ํ•ญ์ฒด ์ธ์‹
	static int arr[][], diff[][], n , m;
	static boolean visited[][], flag;
	static int dx[]= {-1,1,0,0};
	static int dy[]= {0,0,-1,1};
	public static void main(String[] args) throws IOException {
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(bf.readLine());

		n=Integer.parseInt(st.nextToken()); // ์„ธ๋กœ
		m=Integer.parseInt(st.nextToken()); // ๊ฐ€๋กœ

		arr=new int[n][m];
		diff=new int[n][m];
		visited=new boolean[n][m];
		flag= false;

		for(int i=0; i<n; i++) {
			st=new StringTokenizer(bf.readLine());
			for(int j=0; j<m; j++) {
				arr[i][j]=Integer.parseInt(st.nextToken());
			}
		}

		int start_x=-1, start_y=-1;
		for(int i=0; i<n; i++) {
			st=new StringTokenizer(bf.readLine());
			for(int j=0; j<m; j++) {
				int num=Integer.parseInt(st.nextToken());
				if( arr[i][j] != num) {
					diff[i][j]=num;
					if(start_x==-1 && start_y==-1) {
						start_x=i;
						start_y=j;
					}
				}
			}
		}
		if(start_x!= -1 && start_y != -1) search(start_x, start_y);

		for(int i=0; i<n; i++) {
			for(int j=0; j<m; j++) {
				if(diff[i][j]>0) {
					flag=true;
					break;
				}
			}
		}

		if(flag) System.out.println("NO");
		else System.out.println("YES");
	}
	private static void search(int start_x, int start_y) {
		Queue<int[]>queue=new LinkedList<>();
		queue.add(new int[] {start_x, start_y});
		visited[start_x][start_y]=true;
		int num=diff[start_x][start_y];
		diff[start_x][start_y]=0;

		while(!queue.isEmpty()) {
			int temp[]=queue.poll();
			for(int i=0; i<4; i++) {
				int x=temp[0]+dx[i];
				int y=temp[1]+dy[i];
				if(x>=0 && x<n && y>=0 && y<m && !visited[x][y] && arr[temp[0]][temp[1]]==arr[x][y]) {
					if(diff[x][y]==num || (diff[x][y]==0 && arr[x][y]==num)) {
						visited[x][y]=true;
						diff[x][y]=0;
						queue.add(new int[] {x,y});
					}else {
						flag=true;
						break;
					}
				}
			}
			if(flag) break;
		}
	}
}

 

Main

-  ์„ธ๋กœ (n), ๊ฐ€๋กœ (m) ์ž…๋ ฅ

- arr : ๋ฐฑ์‹ ์„ ๋†“๊ธฐ ์ „์˜ ์ดฌ์˜ ๊ฒฐ๊ณผ ์ž…๋ ฅ

- diff : ๋ฐฑ์‹ ์„ ๋†“๊ธฐ ์ „๊ณผ ๋†“์€ ํ›„ ๋‹ฌ๋ผ์ง„ ๊ฐ’๋งŒ ์ €์žฅ

- start_x, start_y : ๋ฐฑ์‹ ์„ ๋†“๊ธฐ ์ „๊ณผ ๋†“์€ ํ›„ ๋‹ฌ๋ผ์ง„ ๊ฐ’ ์ค‘ bfs๋ฅผ ์‹œ์ž‘ํ•  ์œ„์น˜ ์ €์žฅ

- start_x์™€ start_y๊ฐ€ -1์ด๋ฉด ์ดฌ์˜ ์ „๊ณผ ์ดฌ์˜ ํ›„๊ฐ€ ๊ฐ™๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ search ํ•จ์ˆ˜ ํ˜ธ์ถœ x, -1์ด ์•„๋‹ˆ๋ฉด search ํ•จ์ˆ˜ ํ˜ธ์ถœ

- search ํ•จ์ˆ˜ ํ˜ธ์ถœ ํ›„์—๋„ diff์— 0๋ณด๋‹ค ํฐ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด CPCU-1202 ๋ฐฑ์‹ ์ด ์•„๋‹ˆ๋ผ๋Š” ๋œป์ด๋ฏ€๋กœ flag๋ฅผ true๋กœ ๋ฐ”๊ฟˆ

- flag ๊ฐ’์— ๋”ฐ๋ผ NO์™€ YES ์ถœ๋ ฅ

 

Search

- queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๊ฐ’์„ ํ•˜๋‚˜ ๋ฝ‘์•„ ์ƒํ•˜์ขŒ์šฐ ํƒ์ƒ‰

- ์ƒํ•˜์ขŒ์šฐ ๊ฐ’์ด ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ฉฐ ํ˜„์žฌ ์†ํ•ด์žˆ๋Š” ์นธ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ๊ฐ€์ง„๋‹ค๋ฉด

   -> ๋ฐฑ์‹ ์„ ๋†“์€ ๋’ค ํ˜„์žฌ ๊ฐ’๊ณผ ์ƒํ•˜์ขŒ์šฐ ์ด๋™ํ•œ ๊ฐ’์ด ๊ฐ™๊ฑฐ๋‚˜, ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š์•˜์œผ๋ฉฐ ๋ฐฑ์‹  ๋†“์€ ๋’ค ํ˜„์žฌ ๊ฐ’๊ณผ ๊ฐ™๋‹ค๋ฉด ๋ฐฉ๋ฌธ ํ‘œ์‹œ ๋ฐ diff ๊ฐ’๋„ 0์œผ๋กœ ๋ฐ”๊พผ ํ›„ queue์— ์ถ”๊ฐ€

  -> ์œ„ ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ผ๋ฉด flag๋ฅผ true๋กœ ๋ณ€ํ™˜ ํ›„ ํƒˆ์ถœ

 


์ƒ๊ฐ๐Ÿค”

 

๋ฐ”๋€ ๊ฐ’์„ ์ž˜ ๊ณ ๋ คํ•˜์—ฌ bfs๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.