[프로그래머스/Level2] 행렬 테두리

SeokHyun·2022년 7월 1일
0

프로그래머스

목록 보기
10/32

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/77485#

문제 접근

우선, 이 문제는 걍 구현 문제다.

회전해야하는 범위가 [2, 2, 5, 5]라고 가정하면, 아래의 그림처럼 구역을 나누고 회전을 진행한다.

순서대로 cnt=1일 때는 오른쪽으로 한칸씩, cnt=2일 때는 아래로 한칸씩~~~

알고리즘이 뭐 어렵다는 아니고 현재값과 다음값을 잘 저장해서 최소값 찾고 값 밀어넣고만 잘하면 되는 문제였다.

소스 코드

import java.util.List;
import java.util.ArrayList;
import java.util.stream.*;

class Solution {
    public int[] solution(int rows, int columns, int[][] queries) {
        int[][] board = new int[rows + 1][columns + 1];
        int num = 1;
        for (int i = 1; i <= rows; i++) {
            for (int j = 1; j <= columns; j++) {
                board[i][j] = num++;
            }
        }
        
        List<Integer> minValues = new ArrayList<>();
        for (int[] query : queries) {

            int minRow = query[0];
            int maxRow = query[2];
            int minCol = query[1];
            int maxCol = query[3];

            int i = minRow;
            int j = minCol;

            int curVal = board[i][j];
            int nextVal;
            int minVal = 1000000;

            for (int cnt = 1; cnt <= 4; cnt++) {

                if (cnt == 1) {
                    while (j < maxCol) {
                        minVal = Math.min(minVal, curVal);

                        nextVal = board[i][j + 1];
                        board[i][j + 1] = curVal;
                        curVal = nextVal;

                        j++;
                    }
                } else if (cnt == 2) {
                    while (i < maxRow) {
                        minVal = Math.min(minVal, curVal);

                        nextVal = board[i + 1][j];
                        board[i + 1][j] = curVal;
                        curVal = nextVal;

                        i++;
                    }
                } else if (cnt == 3) {
                    while (j > minCol) {
                        minVal = Math.min(minVal, curVal);

                        nextVal = board[i][j - 1];
                        board[i][j - 1] = curVal;
                        curVal = nextVal;

                        j--;
                    }
                } else {
                    while (i > minRow) {
                        minVal = Math.min(minVal, curVal);

                        nextVal = board[i - 1][j];
                        board[i - 1][j] = curVal;
                        curVal = nextVal;

                        i--;
                    }
                }
            }

            minValues.add(minVal);
        }

        return minValues.stream().mapToInt(i1 -> i1).toArray();
    }
}
profile
SI를 넘어 백엔드 엔지니어를 향하여

0개의 댓글