https://www.acmicpc.net/problem/1987
1987번: 알파벳
문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한
www.acmicpc.net
문제 : 1행 1열의 말이 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다. |
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main{
static int R,C,answer = Integer.MIN_VALUE, count = 1;
static int[][] dir = {{1,0},{0,1},{-1,0},{0,-1}};
static char[][] map;
static boolean[][] visited;
static int[] check;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
R = sc.nextInt();
C = sc.nextInt();
map = new char[R][C];
visited = new boolean[R][C];
check = new int[26];
for (int i = 0; i < R; i++) {
String s = sc.next();
for (int j = 0; j < C; j++) {
map[i][j] = s.charAt(j);
}
}//end of input
dfs(0,0);
System.out.println(answer);
}//end of main
public static void dfs(int x, int y) {
visited[x][y] = true;
check[map[x][y]-65] = 1;
for (int i = 0; i < dir.length; i++) {
int nx = x + dir[i][0];
int ny = y + dir[i][1];
if(isInside(nx,ny) && !visited[nx][ny] && check[map[nx][ny]-65] == 0) {
count ++;
dfs(nx,ny);
check[map[nx][ny]-65] = 0;
visited[nx][ny] = false;
count--;
}
}
answer = Math.max(answer, count);
}
public static boolean isInside(int x, int y) {
return x>=0 && x<R && y>=0 && y<C;
}
}
'ALGORITHM > 프로그래머스 | 백준 | 삼성 | 카카오' 카테고리의 다른 글
[백준] 14891번 톱니바퀴 (0) | 2020.09.13 |
---|---|
[백준] 17144번 미세먼지 안녕! (0) | 2020.08.28 |
[백준] 2668번 숫자고르기 (0) | 2020.08.26 |
[프로그래머스] 2018 KAKAO BLIND RECRUITMENT [1차] 비밀지도 (0) | 2020.08.25 |
[프로그래머스] 2019 카카오 개발자 겨울 인턴십 크레인 인형뽑기 게임 (0) | 2020.08.25 |