All :L

[SWEA/Java] 정사각형 방(1861) 본문

CODING/SWEA

[SWEA/Java] 정사각형 방(1861)

ofijwe 2024. 8. 22. 14:21
반응형

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5LtJYKDzsDFAXc

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

1. 문제 분석

문제 개요:
주어진 N x N 크기의 방에서 각 방에 있는 숫자들을 이동시켜서 가장 긴 연속된 숫자 시퀀스를 찾는 문제입니다. 각 숫자는 방의 상하좌우로 이동할 수 있으며, 이동 가능한 숫자들 중 가장 긴 연속된 숫자 시퀀스의 시작 숫자와 길이를 구해야 합니다.

입력 형식:

  1. 첫 줄에 테스트 케이스의 수 T가 주어진다.
  2. 각 테스트 케이스는 다음과 같은 형식이다:
    • 첫 줄에 보드의 크기 N이 주어진다.
    • 다음 N줄에 보드의 상태가 주어진다. 각 줄은 N개의 정수로 구성된다.

출력 형식:

  • 각 테스트 케이스에 대해, 가장 긴 연속된 숫자 시퀀스의 시작 숫자와 길이를 출력한다.

2. 알고리즘 종류

해당 문제는 "깊이 우선 탐색(DFS)" 알고리즘을 사용하여 해결할 수 있습니다. 각 방의 숫자에서 시작하여 인접한 방의 숫자들을 재귀적으로 탐색하여 가장 긴 연속된 숫자 시퀀스를 찾습니다. 이때, 이미 방문한 방을 다시 방문하지 않도록 해야 합니다.

3. 주요 부분 및 코드 작성 방법

1. 탐색 처리:

  • 각 방의 숫자에서 시작하여 상하좌우로 인접한 방의 숫자를 탐색합니다.
  • 현재 방의 숫자보다 1이 더 큰 숫자가 인접하면, 그 방으로 이동하여 탐색을 계속합니다.
  • 가장 긴 연속된 숫자 시퀀스를 찾아서 기록합니다.

2. search() 메서드:

  • 재귀적으로 상하좌우 방으로 이동하며 숫자 시퀀스를 찾습니다.
  • 이동할 수 있는 방이 없거나, 이동 가능한 숫자가 없는 경우 현재 시퀀스의 길이를 반환합니다.

3. main() 메서드:

  • 입력을 읽어와서 방의 상태를 설정합니다.
  • 각 방에서 search() 메서드를 호출하여 가장 긴 연속된 숫자 시퀀스를 찾습니다.
  • 결과를 출력합니다.

4. 코드 설명

DFS 탐색 (search()):

java코드 복사
public static void search(int x, int y) {
    for(int k = 0; k < 4; k++) {
        int nx = x + dx[k];
        int ny = y + dy[k];

        if(nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
        if(room[nx][ny] == room[x][y] + 1) {
            cnt++;
            search(nx, ny);
        }
        if(max < cnt) {
            max = cnt;
        }
    }
}
  • dx와 dy 배열을 사용하여 상하좌우로 이동합니다.
  • 현재 방의 숫자보다 1이 더 큰 숫자가 있는 방으로 이동하여 재귀적으로 탐색합니다.
  • 탐색 후 최대 시퀀스 길이를 업데이트합니다.

5. 전체 코드

java코드 복사
package SWEA1861_240822;

import java.io.*;
import java.util.*;

public class Solution {
    static int N, max, start = 0, cnt;
    static int[][] room;
    static int[] dx = {0, 0, -1, 1};
    static int[] dy = {1, -1, 0, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for(int tc = 1; tc <= T; tc++) {
            N = Integer.parseInt(br.readLine());
            room = new int[N][N];

            for(int i = 0; i < N; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine(), " ");
                for(int j = 0; j < N; j++) {
                    room[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            int[] result = new int[N * N + 1];
            int resultMax = 0;
            for(int i = 0; i < N; i++) {
                for(int j = 0; j < N; j++) {
                    cnt = 1;
                    max = 0;
                    search(i, j);
                    result[room[i][j]] = max;
                    if(resultMax < max) resultMax = max;
                }
            }

            for(int i = 0; i < result.length; i++) {
                if(result[i] == resultMax) {
                    System.out.println("#" + tc + " " + i + " " + resultMax);
                    break;
                }
            }
        }
    }

    public static void search(int x, int y) {
        for(int k = 0; k < 4; k++) {
            int nx = x + dx[k];
            int ny = y + dy[k];

            if(nx < 0 || ny < 0 || nx >= N || ny >= N) continue;
            if(room[nx][ny] == room[x][y] + 1) {
                cnt++;
                search(nx, ny);
            }
            if(max < cnt) {
                max = cnt;
            }
        }
    }
}
  • main() 메서드에서 각 테스트 케이스를 처리하고, 방의 상태를 설정하여 결과를 출력합니다.
  • search() 메서드에서 DFS를 이용해 숫자 시퀀스를 찾습니다.
반응형

'CODING > SWEA' 카테고리의 다른 글

[SWEA/Java] 나무 높이 (14510)  (0) 2024.09.12
[SWEA/Java] 디저트 카페 (2105)  (0) 2024.09.11
[SWEA/Java] 프로세서 연결하기 (1767)  (0) 2024.08.25
[SWEA/Java] 추억의 2048 게임(6190)  (0) 2024.08.22
Comments