https://www.acmicpc.net/problem/3085

 

3085번: 사탕 게임

예제 3의 경우 4번 행의 Y와 C를 바꾸면 사탕 네 개를 먹을 수 있다.

www.acmicpc.net

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

	static int N, maxCandy;
	static char[][] map;
	static int[][] deltas = { { 0, 1 }, { 1, 0 } }; // 우 하

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine()); // 보드의 크기
		map = new char[N][N];
		maxCandy = 0;

		for (int i = 0; i < N; i++) {
			map[i] = br.readLine().toCharArray();
		}

		for (int r = 0; r < N; r++) {
			for (int c = 0; c < N; c++) {
				for (int dir = 0; dir < 2; dir++) {
					int nr = r + deltas[dir][0];
					int nc = c + deltas[dir][1];

					if ((nr < N && nc < N) && (map[r][c] != map[nr][nc])) {
						// 인접한 두 개 바꾸기
						char temp = map[r][c];
						map[r][c] = map[nr][nc];
						map[nr][nc] = temp;

						findMax();
						
						// findMax() 후 원래 map으로 돌려놓기
						temp = map[r][c];
						map[r][c] = map[nr][nc];
						map[nr][nc] = temp;
					}
				}
			}
		}
		System.out.println(maxCandy);
	}

	private static void findMax() {
		// 하 우 방향으로 max찾기

		for (int r = 0; r < N; r++) {
			for (int c = 0; c < N; c++) {
				for (int dir = 0; dir < 2; dir++) {
					int nr = r + deltas[dir][0];
					int nc = c + deltas[dir][1];
					int sum = 1;

					while (true) {
						if ((nr < N && nc < N) && (map[r][c] == map[nr][nc])) {
							sum++;
						}
						maxCandy = Math.max(maxCandy, sum);

						if (nr >= N || nc >= N || map[r][c] != map[nr][nc]) {
							break;
						}

						nr = nr + deltas[dir][0];
						nc = nc + deltas[dir][1];
					}
				}
			}
		}
	}
}

+ Recent posts