[백준 3085] 사탕게임 -Java

hyeokjin·2022년 2월 18일
0

완전탐색 문제로, 재귀함수를 이용하여 구현을 할 까 생각하다가, 결국에는 오른쪽, 아래 값만 비교해서 순차적으로 찾으면 되기 때문에 for문으로 구현했다.

사실 문제 푸는 도중에 조금 헷갈렸던 부분이 있었는데..

모두 같은 색으로 이루어져 있는 가장 긴 연속 부분을 고른 다음 그 사탕을 모두 먹는다

처음에 행,열 한줄 한줄 사탕을 먹으며 제일 큰 수를 찾으려 했다. 하지만
문제에 나와 있듯이 가장 긴 연속 부분을 찾아 그 부분만 먹으면 된다.

아래의 코드로 구현하면 된다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
 
public class Main {

	static int N;
	static int result = Integer.MIN_VALUE;
	static void calculate(char[][] b) {

		// 행 비교하여 가장 긴 연속 부분을 찾아 사탕을 먹는다
		for(int i = 0 ; i < N; i++) {
			int sum1 = 1;
			for(int j = 0 ; j < N-1; j++) {
				if(b[i][j] == b[i][j+1]) {
					sum1++;
				} else {
					sum1 = 1;	
				}
				result = Math.max(result, sum1);
			}
		}
		
        // 열 비교하여 가장 긴 연속 부분을 찾아 사탕을 먹는다
        // 다른 방법으로 열을 비교해봤다.
	    int j = 0;
		while(true) {
			int sum2 = 1;
			for(int i = 0 ; i < b.length-1; i++) {
				if(b[i][j] == b[i+1][j]) {
					sum2++;
				} else {
					sum2 = 1;
				}
				result = Math.max(result, sum2);
			}

			if(j == b.length-1) {
				break;
			}
			j++;
		}

	}
	
	public static void main(String[] args) throws IOException {
        
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		String a = "";
		
		char[][] b = new char[N][N];
		for(int i = 0 ; i < N; i ++) {
			a = br.readLine();
			for(int j = 0 ; j < N; j ++) {
				b[i][j] = a.charAt(j); 
			}
		}

		// 아무것도 교환하지 않았을때
		calculate(b);

		// 행 비교
		for(int i = 0 ; i < N; i++) {
			for(int j = 0 ; j < N-1; j++) {
				if(b[i][j] != b[i][j+1]) {
					// 스왑
				    char temp = b[i][j];
	                b[i][j] = b[i][j + 1];
	                b[i][j + 1] = temp;

	                calculate(b);
	                
                    // 원래대로
	                temp = b[i][j];
	                b[i][j] = b[i][j + 1];
	                b[i][j + 1] = temp;
				}
			}
		}
		
		// 열 비교
		for(int i = 0 ; i < N; i++) {
			for(int j = 0 ; j < N-1; j++) {
				if(b[j][i] != b[j+1][i]) {
					// 스왑
				    char temp = b[j][i];
	                b[j][i] = b[j + 1][i];
	                b[j + 1][i] = temp;

	                calculate(b);
	                
                    // 원래대로
				    temp = b[j][i];
	                b[j][i] = b[j + 1][i];
	                b[j + 1][i] = temp;
				}
			}
		}

		
		System.out.print(result);
		
	}


}
profile
노옵스를향해

0개의 댓글