[JAVA-자바] 3085번: 사탕 게임

2025. 1. 2. 17:12·알고리즘/백준

 

N을 입력받아 N*N의 게임 판을 선언하고, 데이터들을 입력받은 뒤, 한번의 스왑으로 최대의 점수를 얻을수 있는 케이스를 모두 체크해서 출력하는 프로그램입니다.

 

맨 처음에는 모든 칸의 데이터에 대해 상하좌우 스왑을 시도했지만, 중복되어 스왑하는 경우가 있었습니다.

 

소스코드:

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

public class Main {
    static int N;
    static char[][] board; // 보드 선언

    public static void swap(int x1, int y1, int x2, int y2) {
        char temp = board[x1][y1];
        board[x1][y1] = board[x2][y2];
        board[x2][y2] = temp;
    }

    public static int getMaxScore() {
        int maxScore = 0;

        // 행 점수체크
        for (int i = 0; i < N; i++) {
            int score = 1;
            for (int q = 0; q < N - 1; q++) {
                if (board[i][q] == board[i][q + 1]) {
                    score++;
                } else {
                    maxScore = Math.max(maxScore, score);
                    score = 1;
                }
            }
            maxScore = Math.max(maxScore, score);
        }

        // 열 점수체크
        for (int i = 0; i < N; i++) {
            int score = 1;
            for (int q = 0; q < N - 1; q++) {
                if (board[q][i] == board[q + 1][i]) {
                    score++;
                } else {
                    maxScore = Math.max(maxScore, score);
                    score = 1;
                }
            }
            maxScore = Math.max(maxScore, score);
        }

        return maxScore;
    }

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

        int maxScore = 0;
        N = Integer.parseInt(br.readLine());
        board = new char[N][N]; // 보드 크기 선언

        for (int i = 0; i < N; i++) {
            board[i] = br.readLine().toCharArray(); // 입력받기
        }
        br.close();

        for (int x = 0; x < N; x++) { // 행
            for (int y = 0; y < N; y++) { // 열
                //상
                if (y > 0) {
                    swap(x, y, x, y - 1); //스왑
                    maxScore = Math.max(maxScore, getMaxScore());
                    swap(x, y, x, y - 1); //복구
                }
                //하
                if (y < N - 1) {
                    swap(x, y, x, y + 1); //스왑
                    maxScore = Math.max(maxScore, getMaxScore());
                    swap(x, y, x, y + 1); //복구
                }
                //좌
                if (x > 0) {
                    swap(x - 1, y, x, y); //스왑
                    maxScore = Math.max(maxScore, getMaxScore());
                    swap(x - 1, y, x, y); //복구
                }
                //우
                if (x < N - 1) {
                    swap(x + 1, y, x, y); //스왑
                    maxScore = Math.max(maxScore, getMaxScore());
                    swap(x + 1, y, x, y); //복구
                }
            }
        }

        bw.write(String.valueOf(maxScore));

        bw.flush();
        bw.close();
    }
}

 

따라서 상화좌우 4방향으로 스왑을 시도하는것이 아닌, 각 칸에 대해서 한번씩만 스왑을 하게끔 오른쪽과 아래쪽으로만 스왑을 수행하는 방식으로 코드를 개선했습니다.

 

기존의 소스코드에서 위쪽,왼쪽 스왑 부분을 삭제하고 제출한 결과입니다.

 

 

200ms -> 160ms

 

글의 내용 중 잘못된 점이나 수정이 필요한 부분, 혹은 궁금한 사항이 있다면 언제든 댓글로 남겨주시면 감사하겠습니다.

여러분의 피드백은 더 나은 글을 작성하는 데 큰 도움이 됩니다. 감사합니다.

'알고리즘 > 백준' 카테고리의 다른 글

[JAVA-자바] 1107번: 리모컨  (0) 2025.01.08
[JAVA-자바] 6064번: 카잉 달력  (0) 2025.01.03
[JAVA-자바] 9095번: 1, 2, 3 더하기  (0) 2024.12.23
[JAVA-자바] 1748번: 수 이어 쓰기 1  (0) 2024.12.23
[JAVA-자바] 1476번: 날짜 계산  (0) 2024.12.20
'알고리즘/백준' 카테고리의 다른 글
  • [JAVA-자바] 1107번: 리모컨
  • [JAVA-자바] 6064번: 카잉 달력
  • [JAVA-자바] 9095번: 1, 2, 3 더하기
  • [JAVA-자바] 1748번: 수 이어 쓰기 1
raven
raven
Github : https://github.com/RabeMaster | Email : ra___be@naver.com
  • raven
    배움을 원하는 사람
    raven
  • 전체
    오늘
    어제
  • 공지사항

    • 안녕하세요
    • 분류 전체보기 (169)
      • 네이버 부스트캠프 10기 (7)
        • 멤버십 (5)
        • 챌린지 (1)
        • 베이직 (1)
      • 공부 (2)
        • JAVA (1)
        • CS (0)
        • 정보처리기사 (1)
      • 알고리즘 (159)
        • 백준 (159)
      • 개발 (1)
        • 백준 확장 프로그램 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 인기 글

  • 태그

    문자열
    네이버부스트캠프
    최단 경로
    회고
    스택
    코테
    정렬
    IT
    그래프 이론
    멤버십
    부스트캠프
    java
    그래프 탐색
    백준
    그리디 알고리즘
    너비 우선 탐색
    네부캠
    코딩테스트
    수학
    코딩
    네이버
    알고리즘
    자료 구조
    부트캠프
    자바
    다이나믹 프로그래밍
    구현
    개발
    브루트포스 알고리즘
    백트래킹
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
raven
[JAVA-자바] 3085번: 사탕 게임
상단으로

티스토리툴바