백준 3085번 사탕게임

이상민·2023년 8월 15일
0

알고리즘

목록 보기
14/128
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Candy_Game {
    static int N;
    static int max = 0;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        String[][] map = new String[N][N];
        for(int i = 0; i<N; i++){
            String str = br.readLine();
            for(int j = 0; j<N; j++){
                map[i][j] = String.valueOf(str.charAt(j));
            }
        }
        for(int i = 0; i<N; i++){
            for(int j = 0; j<N; j++){
                for(int k = 0; k<2; k++){
                    if(k==0 && j<N-1){
                        String temp = map[i][j+1];
                        map[i][j+1] = map[i][j];
                        map[i][j] = temp;
                        Row(map);
                        Col(map);
                        map[i][j]=map[i][j+1];
                        map[i][j+1]=temp;
                    }
                    else if (k==1 && i<N-1){
                        String temp = map[i+1][j];
                        map[i+1][j] = map[i][j];
                        map[i][j] = temp;
                        Row(map);
                        Col(map);
                        map[i][j]=map[i+1][j];
                        map[i+1][j] =temp;
                    }
                }

            }
        }

        System.out.println(max);
    }
    public static void Row(String[][] map){
        for (int i = 0 ; i < N; i ++) {
            int count = 1;

            for (int j = 0; j < N - 1; j++) {
                if (map[i][j].equals(map[i][j + 1])) {
                    count++;
                    max = Math.max(count, max);
                } else {
                    count = 1;
                }
            }
        }

    }
    public static void Col(String[][] map){
        for (int i = 0 ; i < N; i ++) {
            int count = 1;

            for (int j = 0; j < N - 1; j++) {
                if (map[j][i].equals(map[j+1][i])) {
                    count++;
                    max = Math.max(count, max);
                } else {
                    count = 1;
                }
            }

        }
    }
}

풀이방법

👉 인접한 문자끼리 전부 한번씩 바꿀경우 겹치는 경우의 수가 생긴다. 겹치는 수를 줄이려면 (0,0)부터시작해서 내 오른쪽의 있는문자와 바꾸거나 내 아래에 있는 문자와 바꾸고, (0,1)로 넘어간다. 이를 3중포문으로 나타낼 수있다. 맵을 탐색하는 2중포문, 그안에서 오른쪽 문자와 바꾸는 경우, 아래 문자와 바꾸는경우의 포문
1. 3중 포문으로 나타낸다
2. 문자를 바꾼 map을 탐색하는 함수에 넘겨 준다.
3. 문자를 바꾸고 가장 긴 문자를 탐색할때는 2가지 경우로 탐색할 수 있다.
가로가 가장 길때, 세로가 가장 길때
4. 맵을 탐색하며 다음 문자가 현재 문자와 같으면 count++하고 다르면 count를 1로 초기화 시킨다. 그후 최댓값을 max에 저장한다.
5. 다음 문자를 바꿀때 영향을 끼치지 않도록 맵을 다시 원상태로 돌려준다.

✅따지고 보면 5중포문인셈인데, 완전탐색문제는 안될껏 같아도 일단 해보자
👆 핵심 1. 문자바꾸는 경우의 수가 오른쪽, 아래만 바꾸는것
👆 핵심 2. 탐색시 가로가 가장 길 때, 세로가 가장 길 때로 나눠서 탐색

profile
개린이

0개의 댓글