베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 3085번: 사탕 게임

2022. 8. 21. 10:28

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

 

3085번: 사탕 게임

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

www.acmicpc.net

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

public class java_3085 {
    // 가로 세로 처리
    final static boolean ROW = false;
    final static boolean COLUMN = true;

    // 사탕이 들어있는 보드 [N][N]
    static char board[][];

    // 현재 줄, 방향으로 연속된 사탕의 최댓값
    public static int countCandy(int yx, boolean delta) {
        int maxCount = 1;
        int count = 1;

        int toYX = 1;

        char candy;

        // 한 행
        if (delta == ROW) {
            // 현재 위치의 사탕
            candy = board[yx][0];

            while (true) {
                try {
                    // 같은 색상의 사탕을 만나면 +1
                    if (candy == board[yx][toYX++]) {
                        count++;
                    }
                    // 다른 색깔의 사탕을 만나면
                    // 최댓값이면 갱신 -> 카운트 값 초기화
                    else {
                        candy = board[yx][toYX - 1];
                        if (maxCount < count) {
                            maxCount = count;
                        }
                        count = 1;
                    }
                } catch (ArrayIndexOutOfBoundsException e) {
                    // 최댓값이면 갱신 -> 카운트 값 초기화
                    if (maxCount < count) {
                        maxCount = count;
                    }
                    return maxCount;
                }
            }
        }

        // 한 열
        // (delta == ROW)
        else {
            // 현재 위치의 사탕
            candy = board[0][yx];

            while (true) {
                try {
                    // 같은 색상의 사탕을 만나면 +1
                    if (candy == board[toYX++][yx]) {
                        count++;
                    }
                    // 다른 색깔의 사탕을 만나면
                    // 최댓값이면 갱신 -> 카운트 값 초기화
                    else {
                        candy = board[toYX - 1][yx];
                        if (maxCount < count) {
                            maxCount = count;
                        }
                        count = 1;
                    }
                } catch (ArrayIndexOutOfBoundsException e) {
                    // 최댓값이면 갱신
                    if (maxCount < count) {
                        maxCount = count;
                    }
                    return maxCount;
                }
            }
        }

    }

    // 판을 돌면서 인접한 2개의 사탕 위치를 변경

    public static boolean changeCandySpace(int y, int x, boolean delta) {
        char tmpCandy = board[y][x];

        // 같은 줄에 있는 것을 바꾸기
        if (delta == ROW) {
            try {
                if (board[y][x] == board[y][x + 1]) {
                    return false;
                }
                board[y][x] = board[y][x + 1];
                board[y][x + 1] = tmpCandy;
            } catch (ArrayIndexOutOfBoundsException e) {
                return false;
            }
        }

        // 같은 열에 있는 것을 바꾸기
        else {
            try {
                if (board[y][x] == board[y + 1][x]) {
                    return false;
                }
                board[y][x] = board[y + 1][x];
                board[y + 1][x] = tmpCandy;
            } catch (ArrayIndexOutOfBoundsException e) {
                return false;
            }

        }
        return true;
    }

    public static int solve() {
        int maxCount = 0;

        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[0].length; j++) {

                maxCount = Math.max(maxCount, countCandy(j, COLUMN));
                maxCount = Math.max(maxCount, countCandy(j, ROW));

                // 위 아래 바꾸기
                if (changeCandySpace(i, j, COLUMN)) {
                    maxCount = Math.max(maxCount, countCandy(j, COLUMN));
                    //
                    maxCount = Math.max(maxCount, countCandy(i, ROW));
                    //
                    maxCount = Math.max(maxCount, countCandy(i + 1, ROW));

                    // 위 아래 바꾸기
                    changeCandySpace(i, j, COLUMN);
                }
                // 좌 우 바꾸기
                if (changeCandySpace(i, j, ROW)) {

                    //
                    maxCount = Math.max(maxCount, countCandy(i, ROW));
                    //
                    maxCount = Math.max(maxCount, countCandy(j, COLUMN));
                    //
                    maxCount = Math.max(maxCount, countCandy(j + 1, COLUMN));

                    // 좌 우 바꾸기
                    changeCandySpace(i, j, ROW);
                }
            }
        }

        return maxCount;
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 연속된 사탕을 카운트 하는 함수
        // 1. 가로로 연속된 사탕을 카운트
        // 2. 세로로 연속된 사탕을 카운트

        // 연속된 사탕 중 가장 많은 사탕을 반환

        // 2개의 위치를 바꿔보기,
        // -> 2개의 위치는 [i][j] 기준 [i+1][j], [i][j+1] 만 하면 됨

        int N = Integer.parseInt(br.readLine());

        board = new char[N][N];

        for (int i = 0; i < N; i++) {
            String string = br.readLine();
            for (int j = 0; j < N; j++) {
                board[i][j] = string.charAt(j);
            }
        }

        System.out.println(solve());

        br.close();
        bw.close();
    }
}
저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 1107번: 리모컨  (0) 2022.08.21
[BOJ/JAVA] 4920 테트리스 게임  (0) 2022.08.21
[BOJ/JAVA] 4195번: 친구 네트워크  (0) 2022.08.21
[BOJ/JAVA] 5021번: 왕위 계승  (0) 2022.08.21
[java] 2015번: 수들의 합 4  (0) 2022.08.20
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 1107번: 리모컨
    • [BOJ/JAVA] 4920 테트리스 게임
    • [BOJ/JAVA] 4195번: 친구 네트워크
    • [BOJ/JAVA] 5021번: 왕위 계승
    베오
    베오

    티스토리툴바