[코드트리] 2차원 바람

h_jin·2025년 2월 25일

코테

목록 보기
24/33

문제링크

문제

n * m 배열에 q개의 쿼리가 주어지는데
x1 y1 x2 y2가 주어지고
이 주어진 범위 안에서 모서리 부분을 시계 방향으로 돌리고,
범위에 속하는 모든 값들을 본인 값 + 주변의 값의 평균으로 수정한다.

문제 풀이

  • 구간을 정하고 값들을 밀어준다

코드

import java.util.Scanner;
public class Main {
    public static int[][] lst;
    public static int[][] queries;
    public static int n;
    public static int m;
    public static int q;

    public static void move(int x1, int y1, int x2, int y2) {  
        int temp = lst[x1][y1]; // 왼쪽 상단 값 저장 (시작점)

        // 1️⃣ 왼쪽 열 위로 이동
        for (int i = x1; i < x2; i++) {
            lst[i][y1] = lst[i + 1][y1];
        }

        // 2️⃣ 아래쪽 행 왼쪽으로 이동
        for (int j = y1; j < y2; j++) {
            lst[x2][j] = lst[x2][j + 1];
        }

        // 3️⃣ 오른쪽 열 아래로 이동
        for (int i = x2; i > x1; i--) {
            lst[i][y2] = lst[i - 1][y2];
        }

        // 4️⃣ 위쪽 행 오른쪽으로 이동
        for (int j = y2; j > y1 + 1; j--) {
            lst[x1][j] = lst[x1][j - 1];
        }

        lst[x1][y1 + 1] = temp; // 처음 저장했던 값 넣기

        update(x1, y1, x2, y2);
    }

    public static void update(int x1, int y1, int x2, int y2){ // 값 갱신
        int[][] tmp = new int[n][m];

        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++){
                if(i >= x1 && i <= x2) {
                    if (j >= y1 && j <= y2){
                        int cnt = 1;
                        int sum = lst[i][j];
                        if (i - 1 >= 0){
                            cnt++;
                            sum += lst[i - 1][j];
                        }
                        if (i + 1 < n){
                            cnt++;
                            sum += lst[i + 1][j];
                        }
                        if (j - 1 >= 0){
                            cnt++;
                            sum += lst[i][j - 1];
                        }
                        if (j + 1 < m){
                            cnt++;
                            sum += lst[i][j + 1];
                        }
                        tmp[i][j] = sum / cnt;
                    }else
                        tmp[i][j] = lst[i][j];
                }else
                    tmp[i][j] = lst[i][j];
            }
        }
        lst = tmp;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        q = sc.nextInt();
        lst = new int[n][m];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < m; j++)
                lst[i][j] = sc.nextInt();
        queries = new int[q][4];
        for (int i = 0; i < q; i++)
            for (int j = 0; j < 4; j++)
                queries[i][j] = sc.nextInt() - 1;
        
        for (int i = 0; i < q; i++)
            move(queries[i][0], queries[i][1], queries[i][2], queries[i][3]);
        
        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++)
                System.out.print(lst[i][j] + " ");
            System.out.println();
        }

    }
}

0개의 댓글