[Algorithm] ๐Ÿ ๋ฐฑ์ค€ 2667 ๋‹จ์ง€ ๋ฒˆํ˜ธ ๋ถ™์ด๊ธฐ

HaJingJingยท2021๋…„ 6์›” 15์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
67/119

0. ๋ฌธ์ œ

<๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ์ •์‚ฌ๊ฐํ˜• ๋ชจ์–‘์˜ ์ง€๋„๊ฐ€ ์žˆ๋‹ค. 1์€ ์ง‘์ด ์žˆ๋Š” ๊ณณ์„, 0์€ ์ง‘์ด ์—†๋Š” ๊ณณ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ฒ ์ˆ˜๋Š” ์ด ์ง€๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์—ฐ๊ฒฐ๋œ ์ง‘์˜ ๋ชจ์ž„์ธ ๋‹จ์ง€๋ฅผ ์ •์˜ํ•˜๊ณ , ๋‹จ์ง€์— ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ด๋ ค ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์—ฐ๊ฒฐ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ์ง‘์ด ์ขŒ์šฐ, ํ˜น์€ ์•„๋ž˜์œ„๋กœ ๋‹ค๋ฅธ ์ง‘์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋งํ•œ๋‹ค. ๋Œ€๊ฐ์„ ์ƒ์— ์ง‘์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์—ฐ๊ฒฐ๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. <๊ทธ๋ฆผ 2>๋Š” <๊ทธ๋ฆผ 1>์„ ๋‹จ์ง€๋ณ„๋กœ ๋ฒˆํ˜ธ๋ฅผ ๋ถ™์ธ ๊ฒƒ์ด๋‹ค. ์ง€๋„๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋‹จ์ง€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜๊ณ , ๊ฐ ๋‹จ์ง€์— ์†ํ•˜๋Š” ์ง‘์˜ ์ˆ˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ
์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ํฌ๊ธฐ N(์ •์‚ฌ๊ฐํ˜•์ด๋ฏ€๋กœ ๊ฐ€๋กœ์™€ ์„ธ๋กœ์˜ ํฌ๊ธฐ๋Š” ๊ฐ™์œผ๋ฉฐ 5โ‰คNโ‰ค25)์ด ์ž…๋ ฅ๋˜๊ณ , ๊ทธ ๋‹ค์Œ N์ค„์—๋Š” ๊ฐ๊ฐ N๊ฐœ์˜ ์ž๋ฃŒ(0ํ˜น์€ 1)๊ฐ€ ์ž…๋ ฅ๋œ๋‹ค.

์ถœ๋ ฅ
์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ์ด ๋‹จ์ง€์ˆ˜๋ฅผ ์ถœ๋ ฅํ•˜์‹œ์˜ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋‹จ์ง€๋‚ด ์ง‘์˜ ์ˆ˜๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜์—ฌ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ถœ๋ ฅํ•˜์‹œ์˜ค.

1. ์•„์ด๋””์–ด

๐Ÿ’ก map์ด 1์ด ๋˜๋Š” ๋ถ€๋ถ„ ์ฐพ์•„์„œ visited๊ฐ€ false์ด๋ฉด, bfs๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ•œ ๋‹จ์ง€๋ฅผ ์ฐพ์Œ
๐Ÿ’ก ํ•œ ๋‹จ์ง€ ๋‚ด์—์„œ ์ด์–ด์ ธ ์žˆ๋Š” ์•„ํŒŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์•„ํŒŒํŠธ์˜ ๊ฐœ์ˆ˜๋ฅผ list์— ๋„ฃ์Œ
๐Ÿ’ก ๋Š์–ด์ ธ ์žˆ๋Š” ๊ณณ์€ ๋‹จ์ง€(group)์œผ๋กœ ๊ฐœ์ˆ˜๋ฅผ ์…ˆ
๐Ÿ’ก list๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•จ

2. ํ•ต์‹ฌ ํ’€์ด

  1. map์ด 1์ด ๋˜๋Š” ๋ถ€๋ถ„ ์ฐพ์•„์„œ visited๊ฐ€ false์ด๋ฉด, bfs๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ•œ ๋‹จ์ง€๋ฅผ ์ฐพ์Œ
for(int i=0; i<n; i++) {
	for(int j=0; j<n; j++) {
		if(map[i][j] == 1 && visited[i][j] == false) {
			ret.add(bfs(i,j));
			group++;
		}
	}
}
  1. ํ•œ ๋‹จ์ง€ ๋‚ด์—์„œ ์ด์–ด์ ธ ์žˆ๋Š” ์•„ํŒŒํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉฐ, ์•„ํŒŒํŠธ์˜ ๊ฐœ์ˆ˜๋ฅผ list์— ๋„ฃ์Œ
static int bfs(int x, int y) {
	int apart = 1;
	Queue<Node> q = new LinkedList<>();
	q.add(new Node(x,y));
	visited[x][y] = true;
		
	while(!q.isEmpty()) {
		Node cur = q.poll();
		for(int i=0; i<4; i++) {
			int nx = cur.x + dx[i];
			int ny = cur.y + dy[i];
				
			if(nx < 0 || ny < 0 || nx >= n || ny >= n)
				continue;
				
			if(map[nx][ny] == 1 && visited[nx][ny] == false) {
				visited[nx][ny] = true;
				q.add(new Node(nx, ny));
				apart++;
			}
		}
	}
}
  1. ๋Š์–ด์ ธ ์žˆ๋Š” ๊ณณ์€ ๋‹จ์ง€(group)์œผ๋กœ ๊ฐœ์ˆ˜๋ฅผ ์…ˆ
group++;
  1. list๋ฅผ ์ •๋ ฌํ•˜์—ฌ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ถœ๋ ฅํ•จ
Collections.sort(ret);
		
System.out.println(group);
for(int num : ret) {
	System.out.println(num);
}

3. ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Queue;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Collections;

public class Bruteforce_4 {
	static int n;
	static boolean[][] visited;
	static int[][] map;
	static int[] dx = {0,0,-1,1};
	static int[] dy = {-1,1,0,0};
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(br.readLine());
		int group = 0;
		map = new int[n][n];
		visited = new boolean[n][n];
		List<Integer> ret = new ArrayList<>();
		
		for(int i=0; i<n; i++) {
			String[] s = br.readLine().split("");
			for(int j=0; j<n; j++) {
				map[i][j] = Integer.parseInt(s[j]);
			}
		}
		
		for(int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				if(map[i][j] == 1 && visited[i][j] == false) {
					ret.add(bfs(i,j));
					group++;
				}
			}
		}
		
		Collections.sort(ret);
		
		System.out.println(group);
		for(int num : ret) {
			System.out.println(num);
		}
	}
	
	static int bfs(int x, int y) {
		int apart = 1;
		Queue<Node> q = new LinkedList<>();
		q.add(new Node(x,y));
		visited[x][y] = true;
		
		while(!q.isEmpty()) {
			Node cur = q.poll();
			for(int i=0; i<4; i++) {
				int nx = cur.x + dx[i];
				int ny = cur.y + dy[i];
				
				if(nx < 0 || ny < 0 || nx >= n || ny >= n)
					continue;
				
				if(map[nx][ny] == 1 && visited[nx][ny] == false) {
					visited[nx][ny] = true;
					q.add(new Node(nx, ny));
					apart++;
				}
			}
		}
		
		return apart;
	}
	
	static class Node{
		int x;
		int y;
		Node(int x, int y){
			this.x = x;
			this.y = y;
		}
	}

}

4. ๊ฒฐ๊ณผ

์„ฑ๊ณตโœจ

profile
๐ŸŒฑ์ดˆ๋ณด ๊ฐœ๋ฐœ์ž๐ŸŒฑ

0๊ฐœ์˜ ๋Œ“๊ธ€