๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 28256_์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ

๋ฟŒ์•ผ._. 2024. 7. 12. 20:23
๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/28256)

< ์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ >

 

๋ฌธ์ œ ํ’€์ด 

 

์ดˆ์ฝœ๋ฆฟ์ด ์žˆ๋Š” ๊ณณ์—์„œ ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜์—ฌ ์ดˆ์ฝœ๋ฆฟ์ด ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

 

 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.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _28256_ { // ์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ
	static char arr[][];
	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));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;

		int T = Integer.parseInt(bf.readLine());

		for (int i = 0; i < T; i++) {
			arr = new char[3][3];
			visited = new boolean[3][3];
			for (int j = 0; j < 3; j++) {
				String str = bf.readLine();
				for (int k = 0; k < 3; k++) {
					arr[j][k] = str.charAt(k);
				}
			}

			ArrayList<Integer> result = new ArrayList<>();
			for (int j = 0; j < 3; j++) {
				for (int k = 0; k < 3; k++) {
					if (arr[j][k] == 'O' && !visited[j][k]) {
						visited[j][k] = true;
						result.add(search(j, k, 1));
					}
				}
			}

			Collections.sort(result);

			st = new StringTokenizer(bf.readLine());
			int num = Integer.parseInt(st.nextToken());
			int answer[] = new int[num];
			boolean flag = false;
			for (int j = 0; j < num; j++) {
				answer[j] = Integer.parseInt(st.nextToken());
			}

			if (result.size() != num) {
				bw.write("0\n");
			} else {
				for (int j = 0; j < num; j++) {
					if (result.get(j) != answer[j]) {
						bw.write("0\n");
						flag = true;
						break;
					}
				}
				if (!flag) {
					bw.write("1\n");
				}
			}
		}
		bw.flush();
	}

	private static int search(int a, int b, int cnt) {
		Queue<int[]> queue = new LinkedList<>();
		queue.add(new int[] { a, b });

		while (!queue.isEmpty()) {
			int info[] = queue.poll();
			for (int i = 0; i < 4; i++) {
				int x = info[0] + dx[i];
				int y = info[1] + dy[i];
				if (x >= 0 && x < 3 && y >= 0 && y < 3 && arr[x][y] == 'O' && !visited[x][y]) {
					visited[x][y] = true;
					cnt += 1;
					queue.add(new int[] { x, y });
				}
			}
		}
		return cnt;
	}
}
๋ณ€์ˆ˜)
T : ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜
arr : ์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ ์ƒํƒœ
visited : ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
result : ์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ ๊ฒฐ๊ณผ
num : ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ์ˆซ์ž์˜ ๊ฐœ์ˆ˜
answer : ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ์ˆซ์ž ์ •๋ณด
flag : ์ผ์น˜ ์—ฌ๋ถ€

 

ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๋Š”๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ์ˆ˜๋งŒํผ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

1) ์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ ์ƒํƒœ๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ arr์— ์ €์žฅํ•œ๋‹ค.

2) ์ดˆ์ฝœ๋ฆฟ ๋ณด๊ด€ํ•จ์„ ์‚ดํŽด๋ณด๋ฉฐ ์ดˆ์ฝœ๋ฆฟ์ด ์žˆ๋‹ค๋ฉด search ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ๋ฐ˜ํ™˜๊ฐ’์„ result์— ์ €์žฅํ•œ๋‹ค.

3) result๋ฅผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

4) ํ™”๋ฉด์— ํ‘œ์‹œ๋œ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ๊ทธ ์ˆ˜๋งŒํผ ์ˆซ์ž๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ answer ๋ฐฐ์—ด์— ์ €์žฅํ•œ๋‹ค.

5) result์™€ answer์„ ๋น„๊ตํ•˜๋ฉฐ ์ผ์น˜ํ•˜๋ฉด 1์„ ์ผ์น˜ํ•˜์ง€ ์•Š๋‹ค๋ฉด 0์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

search(์ดˆ์ฝœ๋ฆฟ ์œ„์น˜, 1)

Queue์— ์ดˆ์ฝœ๋ฆฟ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•œ๋‹ค. Queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋‹ค์Œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.

 

1) queue์—์„œ ๊ฐ’ ๊บผ๋‚ด๊ธฐ

2) ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉฐ ์ดˆ์ฝœ๋ฆฟ์ด ์žˆ๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ ํ›„ cnt+1 ๋ฐ queue์— ์œ„์น˜ ์ €์žฅ

 

cnt ๋ฐ˜ํ™˜