Notice
Recent Posts
Recent Comments
Link
Dev.baelanche
[백준 1987] 알파벳 본문
반응형
보드에서 모든 경우를 탐색해야 하기 때문에 백트래킹을 활용한다.
static boolean alpha[] = new boolean[26];
static boolean visited[][];
static int dr[] = {-1, 1, 0, 0};
static int dc[] = {0, 0, -1, 1};
1. 알파벳은 최대 1번만 사용 가능하기 때문에 배열을 만들어 각 알파벳 별로 사용했는지 여부를 체크한다.
2. DFS 도중 같은 지점은 방문할 수 없으므로 방문기록 배열을 만든다.
3. 상하좌우로 이동하기 때문에 방향배열을 만든다.
if(!visited[nr][nc] && !alpha[a[nr][nc] - 'A']) {
visited[nr][nc] = true;
alpha[a[nr][nc] - 'A'] = true;
dfs(nr, nc, cnt + 1);
visited[nr][nc] = false;
alpha[a[nr][nc] - 'A'] = false;
}
완전탐색을 해야하기 때문에 퇴각 탐색을 한다(백트래킹).
public class Main {
static int R;
static int C;
static char a[][];
static boolean alpha[] = new boolean[26];
static boolean visited[][];
static int dr[] = {-1, 1, 0, 0};
static int dc[] = {0, 0, -1, 1};
static int max = 0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
R = sc.nextInt();
C = sc.nextInt();
a = new char[R][C];
visited = new boolean[R][C];
for(int i=0; i<R; i++)
a[i] = sc.next().toCharArray();
alpha[a[0][0] - 'A'] = true;
visited[0][0] = true;
dfs(0, 0, 1);
System.out.println(max);
}
public static void dfs(int r, int c, int cnt) {
for(int i=0; i<4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if(0 <= nr && nr < R && 0 <= nc && nc < C) {
if(!visited[nr][nc] && !alpha[a[nr][nc] - 'A']) {
visited[nr][nc] = true;
alpha[a[nr][nc] - 'A'] = true;
dfs(nr, nc, cnt + 1);
visited[nr][nc] = false;
alpha[a[nr][nc] - 'A'] = false;
}
}
}
max = Math.max(max, cnt);
}
}
반응형
'Data Structure & Algorithm > PS - JAVA' 카테고리의 다른 글
[백준 2580] 스도쿠 (0) | 2019.06.13 |
---|---|
[백준 9663] N-Queen (0) | 2019.06.12 |
[백준 1759] 암호 만들기 (0) | 2019.06.11 |
[백준 14888] 연산자 끼워넣기 (0) | 2019.06.11 |
[백준 14503] 로봇 청소기 (0) | 2019.06.11 |
Comments