본문 바로가기
프로그래머스

프로그래머스 lv2 - 행렬 테두리 회전하기 (자바)

by dragonDeok 2024. 6. 21.
728x90

문제


프로그래머스 lv2 - 행렬 테두리 회전하기

풀이


구현 문제

내 풀이

  • 회전시켜야 할 위치(y,x)와 회전시키기 전 그 위치의 값을 순서대로 리스트에 저장
  • 저장한 리스트에 있는 값을 새로운 배열에 한 칸 씩 오른쪽으로 밀어서 저장
  • 한 칸 씩 밀어서 만든 배열의 값을 회전시키야 할 위치(y,x)에 맨 앞부터 순서대로 넣음

어려웠던 점


c++에는 배열을 한 칸씩 미는 rotate() 함수가 있는데, 자바에서는 그게 없어서 직접 구현해야 해서 번거로웠다.

코드


내 코드 (맘에 안 듬)

import java.util.*;
class Solution {
    static int[] dy = {0, 1, 0, -1}; // 우 하 좌 상
    static int[] dx = {1, 0, -1, 0};
    public int[] solution(int rows, int columns, int[][] queries) {
        int[] answer = new int[queries.length];
        int[][] a = new int[rows][columns];
        int n = 1;
        for (int i = 0; i < rows; i++)
            for (int j = 0; j < columns; j++)
                a[i][j] = n++;

        int c = 0;
        for (int[] cur : queries) {
            int y1 = cur[0], x1 = cur[1], y2 = cur[2], x2 = cur[3];
            y1--; x1--; y2--; x2--;
            ArrayList<int[]> index_list = new ArrayList<>();
            ArrayList<Integer> num = new ArrayList<>();
            index_list.add(new int[]{y1, x1});
            num.add(a[y1][x1]);
            int y = y1, x = x1;
            int d = 0;
            while(d < 4) {
                if (d == 0) {
                    int cnt = 0;
                    while(cnt < x2 - x1) {
                        y += dy[d];
                        x += dx[d];
                        index_list.add(new int[]{y, x});
                        num.add(a[y][x]);
                        cnt++;
                    }
                } else if (d == 1) {
                    int cnt = 0;
                    while(cnt < y2 - y1) {
                        y += dy[d];
                        x += dx[d];
                        index_list.add(new int[]{y, x});
                        num.add(a[y][x]);
                        cnt++;
                    }
                } else if (d == 2) {
                    int cnt = 0;
                    while(cnt < x2 - x1) {
                        y += dy[d];
                        x += dx[d];
                        index_list.add(new int[]{y, x});
                        num.add(a[y][x]);
                        cnt++;
                    }
                } else {
                    int cnt = 0;
                    while(cnt < y2 - y1 - 1) {
                        y += dy[d];
                        x += dx[d];
                        index_list.add(new int[]{y, x});
                        num.add(a[y][x]);
                        cnt++;
                    }
                }
                d++;
            }

            int mn = num.get(num.size() - 1);
            int[] change_num = new int[num.size()];
            change_num[0] = num.get(num.size() - 1);
            for (int i = 0; i < num.size() - 1; i++) {
                change_num[i + 1] = num.get(i);
                mn = Math.min(num.get(i), mn);
            }

            int i = 0;
            for (int[] idx : index_list)
                a[idx[0]][idx[1]] = change_num[i++];

            answer[c++] = mn;
        }
        return answer;
    }
}

더 나은 풀이 (프로그래머스 다른 사람의 풀이 참고)

import java.util.*;
class Solution {
    int[][] matrix;
    public int[] solution(int rows, int columns, int[][] queries) {
        matrix = new int[rows][columns];
        int[] answer = new int[queries.length];

        for(int i = 0; i < rows; i++)
            for(int j = 0; j < columns; j++)
                matrix[i][j] = i * columns + j + 1;

        for(int i = 0; i < queries.length; i++) // 회전하고 최솟값 answer에 저장
            answer[i] = rotate(queries[i]);

        return answer;
    }

    public int rotate(int[] query){
        int y1 = query[0] - 1;
        int x1 = query[1] - 1;
        int y2 = query[2] - 1;
        int x2 = query[3] - 1;

        int temp = matrix[y1][x1];
        int min = temp;
        for(int i = y1; i < y2; i++){ // 위로 이동
            matrix[i][x1] = matrix[i+1][x1];
            if(min > matrix[i][x1]) min = matrix[i][x1];
        }
        for(int i = x1; i < x2; i++){ // 좌측 이동
            matrix[y2][i] = matrix[y2][i+1];
            if(min > matrix[y2][i]) min = matrix[y2][i];
        }
        for(int i = y2; i > y1; i--){ // 아래 이동
            matrix[i][x2] = matrix[i-1][x2];
            if(min > matrix[i][x2]) min = matrix[i][x2];
        }
        for(int i = x2; i > x1; i--){ // 우측 이동
            matrix[y1][i] = matrix[y1][i-1];
            if(min > matrix[y1][i]) min = matrix[y1][i];
        }
        matrix[y1][x1+1] = temp; // 임시저장한 값 저장

        return min;
    }
}