๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 5212_์ง€๊ตฌ ์˜จ๋‚œํ™”

๋ฟŒ์•ผ._. 2023. 11. 22. 10:08

Silver II

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

< ์ง€๊ตฌ ์˜จ๋‚œํ™” >

 

๋ฌธ์ œ ํ’€์ด 

 

์ธ์ ‘ํ•œ ์„ธ ์นธ ๋˜๋Š” ๋„ค ์นธ์— ๋ฐ”๋‹ค๊ฐ€ ์žˆ๋Š” ๋•…์„ ๋ฐ”๋‹ค๋กœ ๋ฐ”๊พผ ํ›„ ์„ฌ์ด ์žˆ๋Š” ๊ณณ์˜ ๊ฐ€์žฅ ์ž‘์€ ์ขŒํ‘œ์™€ ๊ฐ€์žฅ ํฐ ์ขŒํ‘œ๋ฅผ ๊ตฌํ•ด ๊ตฌ๊ฐ„๋งŒํผ ์ถœ๋ ฅํ•œ๋‹ค.

 

 my solution (Java)

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class _5212_ { // ์ง€๊ตฌ ์˜จ๋‚œํ™”
	static char[][] arr, result;
	static int r, c;
	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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(bf.readLine());

		r = Integer.parseInt(st.nextToken());
		c = Integer.parseInt(st.nextToken());

		arr = new char[r][c];
		result = new char[r][c];
		for (int i = 0; i < r; i++) {
			String str = bf.readLine();
			for (int j = 0; j < c; j++) {
				char x = str.charAt(j);
				arr[i][j] = x;
				result[i][j] = x;

			}
		}

		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if(arr[i][j]=='X')
					check(i, j);
			}
		}

		int min_x = -1, min_y = -1, max_x = -1, max_y = -1;
		for (int i = 0; i < r; i++) {
			for (int j = 0; j < c; j++) {
				if (result[i][j] == 'X') {
					if (min_x == -1 || min_x > i) {
						min_x = i;
					} 
					if (min_y == -1 || min_y > j) {
						min_y = j;
					} 
					if (max_x == -1 || max_x < i) {
						max_x = i;
					} 
					if (max_y == -1 || max_y < j) {
						max_y = j;
					}
				}
			}
		}

		for (int i = min_x; i <= max_x; i++) {
			for (int j = min_y; j <= max_y; j++) {
				bw.write(result[i][j]);
			}
			bw.write("\n");
		}
		bw.flush();
	}

	private static void check(int i, int j) {
		int num = 0;
		for (int k = 0; k < 4; k++) {
			int x = i + dx[k];
			int y = j + dy[k];
			if (x < 0 || x >= r || y < 0 || y >= c) {
				num += 1;
			} else if (x >= 0 && x < r && y >= 0 && y < c && arr[x][y] == '.') {
				num += 1;
			}
		}
		if (num >= 3) {
			result[i][j] = '.';
		}
	}
}
๋ณ€์ˆ˜)
r, c : ์ง€๋„์˜ ํฌ๊ธฐ
arr : ์ง€๋„ ์ •๋ณด
result : ๋ฐ”๋€ ์ง€๋„
dx, dy : ์ƒํ•˜์ขŒ์šฐ
min_x, min_y, max_x, max_y : ์„ฌ์ด ์žˆ๋Š” ๊ณณ์˜ ๊ฐ€์žฅ ์ž‘์€ ์ขŒํ‘œ, ๊ฐ€์žฅ ํฐ ์ขŒํ‘œ

 

์ง€๋„์˜ ํฌ๊ธฐ์™€ ์ง€๋„ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ์ €์žฅํ•œ๋‹ค. ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ๊ทธ ์ขŒํ‘œ๊ฐ€ ๋•…์ด๋ผ๋ฉด check ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. check ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์ ‘ํ•œ ์„ธ ์นธ ๋˜๋Š” ๋„ค ์นธ์— ๋ฐ”๋‹ค๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ ํ›„ ์กฐ๊ฑด์— ๋งž๋‹ค๋ฉด ๊ทธ ์ขŒํ‘œ๋ฅผ ๋ฐ”๋‹ค๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค. 

 

์›๋ž˜ ์ง€๋„์™€ ๋ฐ”๋€ ์ง€๋„๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ์ด์œ ๋Š” ๋ฐ”๋‹ค๋กœ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ์ผ์ด์ง€ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์ผ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๋ฐ”๋€ ์ง€๋„๋ฅผ ๋ชจ๋“  ์„ฌ์„ ํฌํ•จํ•˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ง์‚ฌ๊ฐํ˜•์œผ๋กœ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์„ฌ์ด ์žˆ๋Š” ๊ณณ ์ค‘์—์„œ ๊ฐ€์žฅ ์ž‘์€ x, y ์ขŒํ‘œ์™€ ๊ฐ€์žฅ ํฐ x, y ์ขŒํ‘œ๋ฅผ ๊ตฌํ•ด์ค€ ํ›„ ์ž‘์€ ์ขŒํ‘œ์™€ ํฐ ์ขŒํ‘œ ๊ตฌ๊ฐ„์„ ์ถœ๋ ฅํ•œ๋‹ค.