백준 - 1987 : 알파벳 [자바]

HungAh.log·2021년 8월 19일
0
post-custom-banner

평소에 최대/최소값 구하는 문제에서 초기값을 Integer.MAX_VALUE, Integer.MIN_VALUE로 줘서 이 문제도 아무 생각없이 result = Integer.MIN_VALUE로 설정했다.

그런데 이 문제에서는 최대값이 최소 1이었고, 이 경우에 최대값을 바꿔주는 부분이 내 코드에 없어서 테스트케이스에서 오류가 났다!!!
오류를 찾는데 스터디원들의 도움을 받았다

앞으로 초기값 설정 주의하기!!

import java.util.*;
import java.io.*;

public class Main {
	// 좌측 상단 칸(1행,1열)에는 말이 놓임
	// 말은 상하좌우 이동 가능
	// 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과 달라야 한다.
	// 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
	// 좌측상단 칸도 포함, 최대 몇 칸 지날 수 있는지 구하기

	static int R, C, result;
	static char[][] board;
	static int[] dr = { -1, 0, 1, 0 }; // 상우하좌
	static int[] dc = { 0, 1, 0, -1 };
	static boolean[][] v; // 방문했는지

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();

		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);
			}
		}
		v = new boolean[R][C];
		result = 1; // 초기값 주의하기
		dfs(0, 0, board[0][0] + "");

		System.out.println(result);
		br.close();
	}

	static void dfs(int r, int c, String str) {
		v[r][c] = true;

		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 && !v[nr][nc]) {
				char ch = board[nr][nc]; // 이동할 곳의 알파벳이
				if (!str.contains(ch + "")) { // 이전 꺼에 포함되어있지 않다면
					result = Math.max(result, str.length() + 1);
					// 재귀를 타고 돌아왔을 때 str에 변화가 있으면 안되므로
                    // str = str+ch; 하지않고 아래와 같이 보냄
					v[nr][nc] = true;
					dfs(nr, nc, str + ch);
					v[nr][nc] = false;
				}
			}

		}
		// 네 곳 다 확인했는데 갈 곳 없으면,
		return;
	}

}
profile
👩🏻‍💻
post-custom-banner

0개의 댓글