๐Ÿ…ฐ๏ธ๋ฐฑ์ค€ 1987 : ์•ŒํŒŒ๋ฒณ

๊ธ๊ธยท2025๋…„ 10์›” 1์ผ

์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ชฉ๋ก ๋ณด๊ธฐ
18/30

๐ŸฆŽ๋ฌธ์ œ

1987๋ฒˆ : ์•ŒํŒŒ๋ฒณ
LV : ๊ณจ๋“œ 4

์„ธ๋กœ R์นธ, ๊ฐ€๋กœ C์นธ์œผ๋กœ ๋œ ํ‘œ ๋ชจ์–‘์˜ ๋ณด๋“œ๊ฐ€ ์žˆ๋‹ค. ๋ณด๋“œ์˜ ๊ฐ ์นธ์—๋Š” ๋Œ€๋ฌธ์ž ์•ŒํŒŒ๋ฒณ์ด ํ•˜๋‚˜์”ฉ ์ ํ˜€ ์žˆ๊ณ , ์ขŒ์ธก ์ƒ๋‹จ ์นธ (1ํ–‰ 1์—ด)์—๋Š” ๋ง์ด ๋†“์—ฌ ์žˆ๋‹ค.

๋ง์€ ์ƒํ•˜์ขŒ์šฐ๋กœ ์ธ์ ‘ํ•œ ๋„ค ์นธ ์ค‘์˜ ํ•œ ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ƒˆ๋กœ ์ด๋™ํ•œ ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ์€ ์ง€๊ธˆ๊นŒ์ง€ ์ง€๋‚˜์˜จ ๋ชจ๋“  ์นธ์— ์ ํ˜€ ์žˆ๋Š” ์•ŒํŒŒ๋ฒณ๊ณผ๋Š” ๋‹ฌ๋ผ์•ผ ํ•œ๋‹ค. ์ฆ‰, ๊ฐ™์€ ์•ŒํŒŒ๋ฒณ์ด ์ ํžŒ ์นธ์„ ๋‘ ๋ฒˆ ์ง€๋‚  ์ˆ˜ ์—†๋‹ค.

์ขŒ์ธก ์ƒ๋‹จ์—์„œ ์‹œ์ž‘ํ•ด์„œ, ๋ง์ด ์ตœ๋Œ€ํ•œ ๋ช‡ ์นธ์„ ์ง€๋‚  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ๋ง์ด ์ง€๋‚˜๋Š” ์นธ์€ ์ขŒ์ธก ์ƒ๋‹จ์˜ ์นธ๋„ ํฌํ•จ๋œ๋‹ค.


๐ŸฆŽํ’€์ด

ํ•ต์‹ฌ ์•„์ด๋””์–ด : DFS

DFS์˜ ๋ฐฑํŠธ๋ž˜ํ‚น์„ ํ™œ์šฉํ•ด์„œ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ๊ทธ ์ค‘ ์ตœ๋Œ“๊ฐ’์„ ์ฐพ์œผ๋ฉด ๋œ๋‹ค.

์ฝ”๋“œ ํ๋ฆ„

1) HashSet ์ƒ์„ฑ

์ด๋ฏธ ์ง€๋‚˜์˜จ ์•ŒํŒŒ๋ฒณ์€ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ, ์ง€๋‚˜์˜จ ์•ŒํŒŒ๋ฒณ์„ ์ €์žฅํ•˜๋Š” HashSet์„ ์ƒ์„ฑํ•œ๋‹ค.

static HashSet<Character> visited = new HashSet<>();

ArrayList๊ฐ€ ์•„๋‹ˆ๋ผ HashSet์„ ์‚ฌ์šฉํ•œ ์ด์œ ๋Š” ๋ฐฐ์—ด์—์„œ ๊ฐ’์„ ์ถ”๊ฐ€, ์‚ญ์ œ, ํƒ์ƒ‰ํ•˜๋Š” ์‹œ๊ฐ„์ด ํ›จ์”ฌ ์งง๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ArrayList vs HashSet

์—ฐ์‚ฐHashSet (ํ•ด์‹œ ํ…Œ์ด๋ธ”)ArrayList (๋ฐฐ์—ด ๋ฆฌ์ŠคํŠธ)๋น„๊ณ 
add (์ถ”๊ฐ€)ํ‰๊ท  O(1)O(1)ArrayList๋Š” ๋์— ์ถ”๊ฐ€ ์‹œ O(1)
contains (ํฌํ•จ ํ™•์ธ)ํ‰๊ท  O(1)O(K) (์„ ํ˜• ์‹œ๊ฐ„)HashSet์ด ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ์— ๋งค์šฐ ๋น ๋ฆ„
remove (์ œ๊ฑฐ)ํ‰๊ท  O(1)O(K) (์„ ํ˜• ์‹œ๊ฐ„)ArrayList๋Š” ์›์†Œ๋ฅผ ์ฐพ๊ณ  ๋‹น๊ธฐ๋Š” ์ž‘์—… ๋•Œ๋ฌธ์— O(K)

2) dfs ํ•จ์ˆ˜

	private static void dfs(int x, int y, int step) {

		//์ตœ๋Œ“๊ฐ’ ์ฒ˜๋ฆฌ
		maxStep = Math.max(maxStep, step);
		// ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
		visited.add(board[x][y]);

		//๋ธํƒ€ํƒ์ƒ‰์„ ํ†ตํ•ด ๋‹ค์Œ ๊ฐ’์œผ๋กœ ์ด๋™
		for (int k = 0; k < 4; k++) {
			int nx = x + di[k];
			int ny = y + dj[k];

			//๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง€ ์•Š๊ณ  ์ด์ „์— ๋ฐฉ๋ฌธํ•œ ์•ŒํŒŒ๋ฒณ์ด ์•„๋‹ˆ๋ฉด ์ด๋™
			if (nx >= 0 && nx < R && ny >= 0 && ny < C && !visited.contains(board[nx][ny])) {
            //์žฌ๊ท€
				dfs(nx, ny, step + 1);
			}
		}
		// ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์œ„ํ•ด์„œ ์—ฌ๊ธฐ์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ค€๋‹ค.
		visited.remove(board[x][y]);

		return;
	}

๐ŸฆŽ์ „์ฒด ์ฝ”๋“œ

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class backjoon_alpabet_1987 {

	static int[] di = { -1, 1, 0, 0 };
	static int[] dj = { 0, 0, -1, 1 };

	static int R, C;

	static HashSet<Character> visited;
	static char[][] board;

	static int maxStep;

	public static void main(String[] args) throws IOException {
		System.setIn(new FileInputStream("src/input.txt"));

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		StringTokenizer st = new StringTokenizer(br.readLine());

		R = Integer.parseInt(st.nextToken());
		C = Integer.parseInt(st.nextToken());

		board = new char[R][C];

		for (int i = 0; i < R; i++) {
			String str = br.readLine();

			for (int j = 0; j < C; j++) {
				board[i][j] = str.charAt(j);
			}
		}
		visited = new HashSet<>();
		maxStep = 0;

		// dfs
		dfs(0, 0, 1);

		System.out.println(maxStep);
	}

	private static void dfs(int x, int y, int step) {

		// ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
		maxStep = Math.max(maxStep, step);

		visited.add(board[x][y]);

		for (int k = 0; k < 4; k++) {
			int nx = x + di[k];
			int ny = y + dj[k];

			if (nx >= 0 && nx < R && ny >= 0 && ny < C && !visited.contains(board[nx][ny])) {
				dfs(nx, ny, step + 1);
			}
		}
		// ๋ฐฑํŠธ๋ž˜ํ‚น์„ ์œ„ํ•ด์„œ ์—ฌ๊ธฐ์„œ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ œํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
		visited.remove(board[x][y]);

		return;
	}
}

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