๋ฌธ์ (์ถ์ฒ: 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๋ฅผ ํ์ฉํ๋ฉด ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์๋ค.
'๐Algorithm > ๐ฅBaekjoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Baekjoon] 1261_์๊ณ ์คํ (1) | 2023.05.12 |
---|---|
[Baekjoon] 16469_์๋ ์ ํ (0) | 2023.04.25 |
[Baekjoon] 13549_์จ๋ฐ๊ผญ์ง 3 (0) | 2023.03.12 |
[Baekjoon] 17129_์๋ฆฌ์์จ์์ก๋นจ์ด๋ฑ๋ฐ๊ตฌ๋ฆฌ๊ฐ ์ ๋ณด์ฌ์ ์ฌ๋ผ์จ ์ด์ (0) | 2023.03.09 |
[Baekjoon] 15558_์ ํ ๊ฒ์ (0) | 2023.03.09 |