🌞Algorithm/πŸ”₯Baekjoon

[Baekjoon] 27211_도넛 ν–‰μ„±

λΏŒμ•Ό._. 2023. 5. 21. 23:32

Gold V

문제(좜처: https://www.acmicpc.net/problem/27211)

< 도넛 ν–‰μ„±>

 

문제 풀이

 

λΉ„μ–΄μžˆλŠ” κ³³μ—μ„œ μƒν•˜μ’Œμš°λ₯Ό νƒμƒ‰ν•˜μ—¬ λΉ„μ–΄μžˆλŠ” 곳을 μ°Ύμ•„ μ΄λ™ν•œλ‹€.

λ²”μœ„ λ°–μœΌλ‘œ 이동할 λ•ŒλŠ” 이어진 곳을 잘 μƒκ°ν•˜μ—¬ μ΄λ™ν•œλ‹€.

 

 

 - 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 _27211_ { // 도넛 ν–‰μ„±
	static int arr[][], result, n, m;
	static boolean visited[][];
	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];
		visited=new boolean[n][m];
		result=0;

		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());
				if(arr[i][j]==1) visited[i][j]=true;
			}
		}
		for(int i=0; i<n; i++) {
			for(int j=0; j<m; j++) {
				if(!visited[i][j]) {
					visited[i][j]=true;
					result+=1;
					search(i,j);
				}
			}
		}
		System.out.println(result);
	}

	private static void search(int i, int j) {
		Queue<int[]> queue=new LinkedList<>();
		queue.add(new int[] {i,j});

		while(!queue.isEmpty()) {
			int temp[]=queue.poll();
			for(int k=0; k<4; k++) {
				int x=temp[0]+dx[k];
				int y=temp[1]+dy[k];
				if(x==-1) x= n-1;
				if(y==-1) y= m-1;
				if(x==n) x=0;
				if(y==m) y=0;
				if(x>=0 && x<n && y>=0 && y<m && !visited[x][y]) {
					visited[x][y]=true;
					queue.add(new int[] {x,y});
				}
			}
		}
	}
}

 

Main

-  n, m μž…λ ₯

- arr : 도넛 정보

- visited : λ°©λ¬Έ μ—¬λΆ€

- result: νƒν—˜ν•  수 μžˆλŠ” κ΅¬μ—­μ˜ 개수

- 도넛 ν–‰μ„± 정보λ₯Ό μž…λ ₯받은 ν›„ 숲으둜 λ§‰ν˜€ μžˆλŠ” 곳이라면 λ°©λ¬Έ μ—¬λΆ€λ₯Ό true둜 μ €μž₯

- 전체 도넛 행성을 νƒν—˜ν•˜λ©° 아직 λ°©λ¬Έν•˜μ§€ μ•Šμ€ 곳이라면 νƒν—˜μ„ μ‹œμž‘

 

Search

- queueκ°€ 빌 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©΄μ„œ 값을 ν•˜λ‚˜ 뽑아 μƒν•˜μ’Œμš° 탐색

- μƒν•˜μ’Œμš°λ₯Ό νƒμƒ‰ν•˜λ©° λ²”μœ„ 밖이면 도넛 행성이 이어져 μžˆμœΌλ―€λ‘œ μ’Œν‘œλ₯Ό μˆ˜μ •ν•˜μ—¬ λ°©λ¬Έ ν‘œμ‹œ 및 queue에 μΆ”κ°€

 


μƒκ°πŸ€”