1987๋ฒ : ์ํ๋ฒณ
LV : ๊ณจ๋ 4
์ธ๋ก R์นธ, ๊ฐ๋ก C์นธ์ผ๋ก ๋ ํ ๋ชจ์์ ๋ณด๋๊ฐ ์๋ค. ๋ณด๋์ ๊ฐ ์นธ์๋ ๋๋ฌธ์ ์ํ๋ฒณ์ด ํ๋์ฉ ์ ํ ์๊ณ , ์ข์ธก ์๋จ ์นธ (1ํ 1์ด)์๋ ๋ง์ด ๋์ฌ ์๋ค.
๋ง์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ๋ค ์นธ ์ค์ ํ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋๋ฐ, ์๋ก ์ด๋ํ ์นธ์ ์ ํ ์๋ ์ํ๋ฒณ์ ์ง๊ธ๊น์ง ์ง๋์จ ๋ชจ๋ ์นธ์ ์ ํ ์๋ ์ํ๋ฒณ๊ณผ๋ ๋ฌ๋ผ์ผ ํ๋ค. ์ฆ, ๊ฐ์ ์ํ๋ฒณ์ด ์ ํ ์นธ์ ๋ ๋ฒ ์ง๋ ์ ์๋ค.
์ข์ธก ์๋จ์์ ์์ํด์, ๋ง์ด ์ต๋ํ ๋ช ์นธ์ ์ง๋ ์ ์๋์ง๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ง์ด ์ง๋๋ ์นธ์ ์ข์ธก ์๋จ์ ์นธ๋ ํฌํจ๋๋ค.
DFS์ ๋ฐฑํธ๋ํน์ ํ์ฉํด์ ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ณ ๊ทธ ์ค ์ต๋๊ฐ์ ์ฐพ์ผ๋ฉด ๋๋ค.
์ด๋ฏธ ์ง๋์จ ์ํ๋ฒณ์ ๋ค์ ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฏ๋ก, ์ง๋์จ ์ํ๋ฒณ์ ์ ์ฅํ๋ 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) |
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;
}
}