์๋ฝํ์ธ์! Eric ์ ๋๋ค!
์ค๋์ ์ ๊ฐ bfs ๋ฌธ์ ๋ฅผ ํ๋ ํ์ด๋ณด๋ ค ํฉ๋๋ค!
๋ฌธ์ ๋ ๋ฐฑ์ค 2583๋ฒ ์์ญ๊ตฌํ๊ธฐ ๋ฌธ์ ์ ๋๋ค!
๋ฌธ์

ํด์ค
์ฐ์ ๋ฌธ์ ๋ฅผ ํ๊ธฐ์ํด์๋ map ์ด๋ผ๋ int[][] ๋ฐฐ์ด์ ๋ง๋ค์ด ์ค๋๋ค.
์ด๋์ int[][] map = new intp[M][N] ์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋๋ค.
์๋ํ๋ฉด ํด๋น ๋ชจ๋์ข ์ด๊ฐ ์ ๋ ฅ์ ์ฒซ๋ฒ์งธ ์ค์์ ๊ทธ๋ ๊ฒ ์ฃผ์ด์ง๋ฏ๋ก
๊ทธ๋ฆฌ๊ณ ์ ๋ ฅ์ ์ฒซ๋ฒ์งธ ์ค์์ ๋ง์ง๋ง์ผ๋ก ๋ฐ๋ K๊ฐ์
for ๋ฌธ์ ํตํด์ K๋ฒ ๋์์ ์ ๋ ฅ์์ ์ฃผ์ด์ง ๊ฐ์ map ์ ํ์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ bfs ๋ฅผ ๋๋ฉด์
ํด๋น ํ๋ ์์ญ์ ๋ฉด์ ์ ๊ตฌํฉ๋๋ค.
bfs ๋ฅผ ๋๋ฉด์ dx, dy๋ฅผ ํตํด์ ์์์ ์ ๊ธฐ์ค์ผ๋ก ์,ํ,์ข,์ฐ ์ map ๊ฐ์ด 0 ์ด๋ฉด ํด๋น์์ญ์ผ๋ก ์ด๋ํ๋ฉด์
์์ญ์ ํฌ๊ธฐ๋ฅผ ์ฆ๊ฐ์ํค๊ณ ,
๋ง์ฝ map๊ฐ์ด 1 ์ด๋ฉด ๊ทธ์ชฝ ๋ฐฉํฅ์ผ๋ก๋ ์ด๋ํ์ง ์๊ณ ๋๋ ๋๋ค.
์ด๋, ์ด๋ํ๋ ๋งํผ์ ์์ด ์ฐ๋ฆฌ๊ฐ ๊ตฌํ๊ณ ์ํ๋ ๋ฉด์ ์ ํฌ๊ธฐ๋ฅผ area+1 ์ฉ ์ฆ๊ฐ์ํค๋ฉด ๋ฉ๋๋ค.
์๋ํ๋ฉด ํด๋น ๋๊ธ์ ๋ฉด์ ์ด 1*1 ์ด๋ฏ๋ก area+1์ ํด์ฃผ๋ฉด ๋ฉ๋๋ค.

๊ทธ๋ฆฌ๊ณ bfs๋ฅผ ๊ตฌํ๋ ์กฐ๊ฑด์ด ๋ ๋๋ง๋ค cnt+1์ ํด์ฃผ์ด
๋๋์ด์ง ํด๋น ๋ถ๋ถ์ ๊ฐ์๋ฅผ ๊ตฌํ ์ ์์ต๋๋ค.
์ฝ๋
import java.io.BufferedReader; | |
import java.io.IOException; | |
import java.io.InputStreamReader; | |
import java.util.*; | |
public class N2583 { | |
static int N, M, K; | |
static int[] dx = {0, 1, 0, -1}; // x๊ฐ์ด ๋ณํ ๊ฐ๋ฅํ ๋ฒ์ | |
static int[] dy = {1, 0, -1, 0}; // y๊ฐ์ด ๋ณํ ๊ฐ๋ฅํ ๋ฒ์ | |
static boolean[][] visited; // ํด๋น ์นธ์ ์ง๋ด๊ฐ์ผ๋ฉด true | |
static int[][] map; | |
public static void main(String[] args) throws IOException { | |
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); | |
// 0. ์ ๋ ฅ | |
StringTokenizer st = new StringTokenizer(br.readLine()); | |
M = Integer.parseInt(st.nextToken()); | |
N = Integer.parseInt(st.nextToken()); | |
K = Integer.parseInt(st.nextToken()); | |
map = new int[M][N]; | |
visited = new boolean[M][N]; | |
ArrayList<Integer> list = new ArrayList<>(); | |
int cnt = 0; | |
// 1. map์ ๊ทธ๋ฆผ ํ์ ํ๊ธฐ | |
for (int i = 0; i < K; i++) { | |
st = new StringTokenizer(br.readLine()); | |
int x1 = Integer.parseInt(st.nextToken()); | |
int y1 = Integer.parseInt(st.nextToken()); | |
int x2 = Integer.parseInt(st.nextToken()); | |
int y2 = Integer.parseInt(st.nextToken()); | |
// ์ฃผ์ด์ง ์ฌ๊ฐํ์ ๋์ ์ ๊ฐ๊ฐ for๋ฌธ์ ๋๋ฉด์ ๋ฉด์ ๋ถ๋ถ์ 1๋ก ํ์๋ฅผํฉ๋๋ค. | |
for (int y = y1; y < y2; y++) { | |
for (int x = x1; x < x2; x++) { | |
map[y][x] = 1; | |
} | |
} | |
} | |
// 2. bfs ๋๊ธฐ ๋ฐ ์์ญ ๋ฐ์ดํฐ ๋ฝ๊ธฐ | |
for (int i = 0; i < M; i++) { | |
for (int j = 0; j < N; j++) { | |
if (!visited[i][j] && map[i][j] == 0) { | |
int area = bfs(new Point(i, j)); | |
list.add(area); | |
cnt++; | |
} | |
} | |
} | |
// 4. ์ถ๋ ฅ | |
System.out.println(cnt); | |
Collections.sort(list); | |
for (int x : list) { | |
System.out.print(x + " "); | |
} | |
br.close(); | |
} | |
// 3. bfs ๋ก ์์ญ ๊ตฌํด๋ณด๊ธฐ | |
public static int bfs(Point pt) { | |
Queue<Point> queue = new LinkedList<>(); | |
queue.offer(pt); | |
visited[pt.x][pt.y] = true; | |
int area = 1; // area ๊ฐ 1๋ก ๋ถํฐ ์์ํ ์ด์ ๋ ์ด๋ฏธ bfs๋ก ๋ค์ด์๋ค๋๊ฑฐ ์์ฒด๊ฐ 1๊ฐ ์ด์ ์ด๋ผ๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก | |
while (!queue.isEmpty()) { | |
Point tmp = queue.poll(); | |
int curX = tmp.x; | |
int curY = tmp.y; | |
for (int i = 0; i < 4; i++) { | |
int nx = curX + dx[i]; | |
int ny = curY + dy[i]; | |
if (nx >= 0 && nx < M && ny >= 0 && ny < N) { | |
if (!visited[nx][ny] && map[nx][ny] == 0) { | |
visited[nx][ny] = true; | |
queue.offer(new Point(nx, ny)); | |
area++; | |
} | |
} | |
} | |
} | |
return area; //ํด๋น ์์ญ์ ๋ฉด์ | |
} | |
} | |
// ์์ญ์ ๊ด๋ฆฌํ๊ธฐ์ํด์ Point ๋ผ๋ Class ๋ก ๊ด๋ฆฌ | |
class Point { | |
int x; | |
int y; | |
public Point(int x, int y) { | |
this.x = x; | |
this.y = y; | |
} | |
} |

'๐ป ๊ฐ๋ฐ๊ณต๋ถ > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Eric's ๋ฐฑ์ค] 27467๋ฒ - ์ํ ํด์ฆ - Java - KSA Automata Winter Contest (0) | 2023.02.12 |
---|---|
[Eric's ๋ฐฑ์ค] 1759๋ฒ - ์ํธ ๋ง๋ค๊ธฐ - JAVA (2) | 2023.02.11 |
[Eric's ๋ฐฑ์ค] 1946๋ฒ - ์ ์ ์ฌ์ - Java (0) | 2023.02.09 |
[Eric's ๋ฐฑ์ค] 2217๋ฒ - ๋กํ - Java (0) | 2023.02.08 |
[Eric's ๋ฐฑ์ค] 11727๋ฒ - 2 x n ํ์ผ๋ง 2 - Java (0) | 2023.02.08 |