백준 3085번 : 사탕 게임

반응형

백준 3085번 : 사탕게임

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

public class Main {
    String[] candyColor;
    int n = 0;
    int max = 0;
    public void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        n = Integer.parseInt(br.readLine());

        for(int i = 0; i<n; i++){
            sb.append(br.readLine());
        }
        candyColor = sb.toString().split("");
        max = game();
        for(int i = 0; i<n*n; i+=n){
            for(int j = 0; j<n-1; j++){
                swap(i + j, i + j + 1);
                int checkCandy = game();
                if (checkCandy > max) {
                    max = checkCandy;
                }
                swap(i + j, i + j + 1);
            }
        }
        for(int i = 0; i<n; i++){
            for(int j = 0; j+i+n<n*n; j+=n) {
                swap(i+j, i+j+n);
                int checkCandy = game();
                if(checkCandy > max){
                    max = checkCandy;
                }
                swap(i+j, i+j+n);
            }
        }
        System.out.println(max);
    }

    public void swap(int a, int b){
        String temp = candyColor[a];
        candyColor[a] = candyColor[b];
        candyColor[b] = temp;
    }

    public int game(){
        int result = 0;
        int countX = 0;
        int countY = 0;
        for(int i = 0; i <n*n; i+=n){
            countX = 0;
            for(int j = 0; j<n-1; j++) {
                if (candyColor[i+j].equals(candyColor[i+j+1])) {
                    countX++;
                    if(countX>result) result = countX;
                }else{
                    countX = 0;
                }
            }
        }
        for(int i = 0; i<n; i++){
            countY = 0;
            for(int j = 0; j+i+n<n*n; j+=n) {
                if (candyColor[i+j].equals(candyColor[i+j+n])) {
                    countY++;
                    if(countY>result) result = countY;
                }else{
                    countY = 0;
                }
            }
        }
        return result+1;
    }
    
    public static void main(String args[]) throws IOException {
        new Main().solution();
    }
}

문제 없다고 생각했는데 자꾸 통과가 되지 않았다. 이유는 배열을 다시 되돌리는 과정에서 되돌리는 부분이 if문 안에 들어가서 다시 못되돌리고 있었는데... 그걸 못찾았다... 2차원 배열로 풀었어야 되나 싶지만, 표기만 다를 뿐 컴퓨터가 읽는 동작은 동일하기 때문에 따로 2채원 배열로 만들진 않았다.

 

풀이 결론

먼저 n*n의 사탕 게임의 가로와 세로를 각각 계산해 이어져 있는 가장 큰 수를 리턴하는 함수를 만들어 놓는다.

비슷한 로직으로 가로 먼저 각각 인덱스를 교환해주고, 만들어 놓은 함수를 호출해 숫자를 리턴한다. 그 후 다시 인덱스를 원래대로 교환해준다. 가로가 끝났다면 다시 세로를 반복해주고, 이 모든 과정에서 나온 가장 큰수를 출력한다.

반응형

'개발 > 알고리즘' 카테고리의 다른 글

백준 1748번 : 수 이어쓰기1  (0) 2023.01.01
백준 1476번 : 날짜 계산  (0) 2022.12.29
백준 2309번 : 일곱 난쟁이  (0) 2022.12.28
백준 6588번 : 골드바흐의 추측  (0) 2022.12.28
백준 1929번 : 소수 구하기  (0) 2022.12.28