https://www.acmicpc.net/problem/1987
1๋ ์ ์ ํ์์ผ๋ ๋ชจ๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ํต๊ณผํ์ง ๋ชปํ์ฌ ์คํจ๋ก ๋จ์์๋ ๋ฌธ์ ์ด๋ค. ๋ค์ ํ์๋๋ฐ๋ ๊ฐ์ ๋ก์ง์ผ๋ก ์ดํดํ๊ณ ํ๊ฒ ๋๋ค. ๋ถ๋ช ๋ง๋ ๊ฒ ๊ฐ์๋ฐ ์๋๋๊น ๋ต๋ตํด์ ๊ฒฐ๊ตญ ์ ๋ต ์ฝ๋์ ๊ณ์ ๋น๊ตํ ๋์ ์ ๋ต์ ๋์ถํด๋ผ ์ ์์๋ค.
์ฝ๋ - ์คํจ
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
static int R, C;
static char[][] graph;
static boolean[][] visited;
static ArrayList<Character> letters;
static int count;
static int max= 0;
static int[] dx = {1, -1, 0, 0};
static int[] dy = {0, 0, 1, -1};
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
R = Integer.parseInt(input[0]);
C = Integer.parseInt(input[1]);
graph = new char[R + 1][C + 1];
visited = new boolean[R + 1][C + 1];
for(int i = 1; i <= R; i++) {
String row = br.readLine();
for(int j = 0; j < C; j++) {
graph[i][j + 1] = row.charAt(j);
}
}
letters = new ArrayList<Character>();
count = 1;
dfs(1, 1);
System.out.println(max);
}
private static void dfs(int v1, int v2) {
visited[v1][v2] = true; //์ ์ ๋ฐฉ๋ฌธ
letters.add(graph[v1][v2]);
for(int i = 0; i < 4; i++) { //์ํ์ข์ฐ ํ์
int nx = v1 + dx[i];
int ny = v2 + dy[i];
if(1 <= nx && nx <= R && 1 <= ny && ny <= C) { //์ขํ ๋ฒ์ ์์ ์๊ณ
if(!letters.contains(graph[nx][ny]) && !visited[nx][ny]) { //์ง๊ธ๊น์ง ์ง๋์จ ์ํ๋ฒณ๊ณผ ๋ค๋ฅด๊ณ , ๋ฐฉ๋ฌธx๋ผ๋ฉด
dfs(nx, ny); //ํ์
count++;
}
}
}
visited[v1][v2] = false; //์ ์ ๋ฐฉ๋ฌธ ์ด๊ธฐํ!!
max = Math.max(max, count);
}
}
์์ ์ ๋ ฅ 3๋ฒ์ด ์๋๋ค.
5 5
IEFCJ
FHFKC
FFALF
HFGCF
HMCHH
๋๋ visited[x][y] ๋ฐฐ์ด์ ์ฌ์ฉํ์ฌ ์ขํ์ ๋ฐฉ๋ฌธ ์ค๋ณต์ ๋ง๋๋ก ํ์๋ค. ํ์ง๋ง ์ด ๋ฌธ์ ์์๋ ์ขํ์ ๋ฐฉ๋ฌธ ์ค๋ณต์ ๋ง๋ ๊ฒ์ด ์๋๋ผ, ๋ฌธ์์ ์ค๋ณต์ ๋ง์์ผ ํ๋ค. ์ฆ, ์ํ๋ฒณ๋ง ๋ค๋ฅด๋ค๋ฉด ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ์ขํ๋ฅผ ํ์ ๋ฐฉ๋ฌธํด๋ ๋๋ค.
๋ฐ๋ผ์ ๋ฌธ์์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ฒดํฌํ 26์นธ ์ง๋ฆฌ ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํ๋ค. ์์คํค ์ฝ๋๋ฅผ ์ฐธ๊ณ ํ์ฌ ์ธ๋ฑ์ค๋ ๋ฌธ์ - 'A'๋ก ํด์ค์ผ 0๋ฒ๋ถํฐ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ด์ ํ์ํ์ง ๋ชปํ๋ฉด, ํจ์๋ฅผ ๋๋ด๊ธฐ ์ ์ ๋ฌธ์์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ false ์ฒ๋ฆฌํด์ค์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ max ๊ฐ๋ ๊ฐฑ์ ํด์ค๋ค. (๊ทผ๋ฐ ์ด ๋ถ๋ถ์ด ๊ณ์ ์ฌ๊ท๊ฐ ์ข ๋ฃ๋ ๋๋ง๋ค ํธ์ถ๋๋ค.. ์ด๋ป๊ฒ ๊ฐ์ ํ ์ ์๋..?)
์ฝ๋ - ์ฑ๊ณต
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class b1987 {
static int R, C;
static char[][] graph;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
static boolean[] alphabet;
static int count;
static int max;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
graph = new char[R + 1][C + 1];
for(int i = 1; i <= R; i++) {
String row = br.readLine();
for(int j = 1; j <= C; j++) {
graph[i][j] = row.charAt(j - 1);
}
}
alphabet = new boolean[26];
count = 1;
max = 0;
dfs(1, 1, 1);
System.out.println(max);
}
public static void dfs(int x, int y, int count) {
alphabet[graph[x][y] - 'A'] = true; //์ํ๋ฒณ ์ค๋ณต ์๋๊ฒ ์ฒ๋ฆฌ
for(int i = 0; i < 4; i++) { //์ํ์ข์ฐ ํ์
int nx = x + dx[i];
int ny = y + dy[i];
if(1 <= nx && nx <= R && 1 <= ny && ny <= C) { //์ขํ ๋ฒ์ ์์ ์๊ณ
if(!alphabet[graph[nx][ny] - 'A']) { //์ง๊ธ๊น์ง ์ง๋์จ ์ํ๋ฒณ๊ณผ ๋ค๋ฅด๋ฉด
dfs(nx, ny, count + 1); //ํ์
}
}
}
//ํ์ ๋๋จ
alphabet[graph[x][y] - 'A'] = false;
max = Math.max(max, count);
}
}
๊ฒฐ๊ณผ
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1193๋ฒ - ๋ถ์์ฐพ๊ธฐ (0) | 2022.08.21 |
---|---|
๋ฐฑ์ค 15686๋ฒ - ์นํจ ๋ฐฐ๋ฌ (0) | 2022.08.21 |
14889๋ฒ - ์คํํธ์ ๋งํฌ (0) | 2022.08.16 |
๋ฐฑ์ค 2961๋ฒ - ๋์์ด๊ฐ ๋ง๋ ๋ง์๋ ์์ (0) | 2022.08.16 |
๋ฐฑ์ค 17406๋ฒ - ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 4 (0) | 2022.08.11 |