-
백준 1987번 알파벳(자바) - dfs코딩테스트 2023. 1. 11. 17:16
알파벳
한국어시간 제한메모리 제한제출정답맞힌 사람정답 비율2 초 256 MB 85066 27335 16699 29.089% 문제
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.
말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.
입력
첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1 ≤ R,C ≤ 20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.
출력
첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.
예제 입력 1 복사
2 4 CAAB ADCB
예제 출력 1 복사
3
예제 입력 2 복사
3 6 HFDFFB AJHGDH DGAGEH
예제 출력 2 복사
6
예제 입력 3 복사
5 5 IEFCJ FHFKC FFALF HFGCF HMCHH
예제 출력 3 복사
10
알파벳을 하나씩 지날 때마다 ArrayList에 넣어주고, contains를 활용해 다음 칸의 알파벳이 이미 list 안에 있는지 체크했다.
주의해야 할 점은 dfs가 끝나고 돌아올 때 ArrayList에서 해당 알파벳을 제거해줘야 한다.
import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Scanner; import java.util.StringTokenizer; public class Main { static int r,c; static boolean visited[][]; static char[][] map; static int[] dx = {-1,1,0,0}; static int[] dy = {0,0,-1,1}; static int answer = 0; public static void main(String[] args) throws Exception{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); r = Integer.parseInt(st.nextToken()); c = Integer.parseInt(st.nextToken()); visited = new boolean[r][c]; map = new char[r][c]; for (int i = 0; i < r; i++) { String str = br.readLine(); for (int j = 0; j < c; j++) { map[i][j] = str.charAt(j); } } visited[0][0] = true; dfs(0,0,0, new ArrayList<>()); System.out.println(answer+1); } static void dfs(int x, int y, int depth, ArrayList<Character> road) { road.add(map[x][y]); answer = Math.max(answer, depth); for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; if (nx < 0 || nx >= r || ny < 0 || ny >= c) continue; if (!visited[nx][ny] && !road.contains(map[nx][ny])) { visited[nx][ny] = true; dfs(nx,ny,depth+1,road); visited[nx][ny] = false; road.remove(road.size()-1); } } } }
'코딩테스트' 카테고리의 다른 글
백준 1522번 문자열 교환(자바) - 슬라이딩 윈도우# (0) 2023.01.16 백준 2206번 벽 부수고 이동하기(자바) - bfs## (0) 2023.01.16 백준 15684번 사다리 조작(자바) - dfs, 삼성 sw 역량 기출## (0) 2023.01.11 백준 14890 경사로(자바) - 시뮬레이션, 삼성 sw 역량 기출# (0) 2023.01.04 백준 14658번 하늘에서 별똥별이 빗발친다(자바) # (1) 2023.01.02