delpho

[JAVA] 백준 3085 - 사탕 게임 본문

알고리즘/BFS, DFS

[JAVA] 백준 3085 - 사탕 게임

delpho 2022. 3. 7. 21:23

문제가 조금 어려웠다..

 

 

제 생각에, 이 문제에서 떠올려야 할 중요한 부분은

  1. 4방탐색 (인접한 부분이 다르다면)
  2. 행, 열 탐색 (최대 길이의 연속된 문자 길이를 체크 후 max에 저장)

이라고 생각합니다.

 

 

하단은 저의 코드이며, 질문, 태클 환영입니닷!

 

 

 

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class BJ_3085_사탕게임 {
 
    public static void main(String[] args) throws NumberFormatException, IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int N = Integer.parseInt(br.readLine());
        
        char[][] map = new char[N][N];
        
        for (int i = 0; i < N; i++) {
            char[] tmp = br.readLine().toCharArray();
            for (int j = 0; j < N; j++) {
                map[i][j] = tmp[j];
            }
        }
        
        int max = 0;
        
        // 상, 하, 좌, 우
        int[][] dd = {{-1,0},{1,0},{0,-1},{0,1}};
        
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                
                for (int j2 = 0; j2 < 4; j2++) {
                    int row = i+dd[j2][0];
                    int col = j+dd[j2][1];
                    
                    if(row>=0 && col>=0 && row<&& col<&& map[i][j] != map[row][col]) {
                        char tmp = map[i][j];
                        map[i][j] = map[row][col];
                        map[row][col] = tmp;
                        
                        // 행, 열 탐색을 위한 코드
                        // 문자 별로 체크하는 것이 아닌, 문자가 연속되면 Cnt를 늘려가는 방식
                        for (int l = 0; l < N; l++) {
                            int rowCnt = 1;
                            int colCnt = 1;
                            for (int k = 0; k < N-1; k++) {
                                if(map[k][l] == map[k+1][l])    rowCnt++;
                                else    rowCnt=1;
                                
                                if(map[l][k] == map[l][k+1])    colCnt++;
                                else colCnt=1;
                                
                                max = Math.max(max, rowCnt);
                                max = Math.max(max, colCnt);
                            }
                        }
                        tmp = map[i][j];
                        map[i][j] = map[row][col];
                        map[row][col] = tmp;
                    }
                }
            }
        }
        System.out.println(max);
    }
}
cs

 

 

 

개인적으로 생각하는 이 문제에서의 중요 코드

 

for (int l = 0; l < N; l++) {
    int rowCnt = 1;
    int colCnt = 1;
    for (int k = 0; k < N-1; k++) {
        if(map[k][l] == map[k+1][l])    rowCnt++;
        else    rowCnt=1;
        
        if(map[l][k] == map[l][k+1])    colCnt++;
        else colCnt=1;
        
        max = Math.max(max, rowCnt);
        max = Math.max(max, colCnt);
        
    }
    
}
cs