[프로그래머스] 행렬 테두리 회전하기

김개발·2021년 8월 12일
0

프로그래머스

목록 보기
14/42

문제 푼 날짜 : 2021-08-12

문제

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

접근 및 풀이

주어진 좌표를 두 꼭지점으로하여 직사각형을 그렸을 때, 직사각형의 네 변이 지나가는 좌표를 기준으로 시계방향으로 일일이 값을 한 칸씩 옮겨주었다.
직사각형의 우측상단 모서리의 값 (x1, y2)을 저장해두고, 윗변, 왼변, 아랫변, 오른변 순으로 시계방향으로 한 칸씩 옮겨준 다음, 마지막으로 저장해둔 값을 (x1 + 1, y2)에 대입해주었다.

코드

#include <string>
#include <vector>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    
    int arr[101][101];
    int num = 1;
    for (int i = 1; i <= rows; i++) {
        for (int j = 1; j <= columns; j++) {
            arr[i][j] = num++;
        }
    }
    
    for (auto q : queries) {
        int x1 = q[0], y1 = q[1], x2 = q[2], y2 = q[3];
        
        int corner = arr[x1][y2];
        int ret = corner;
        for (int i = y2; i > y1; i--) {
            arr[x1][i] = arr[x1][i - 1];
            ret = min(ret, arr[x1][i]);
        }
        for (int i = x1; i < x2; i++) {
            arr[i][y1] = arr[i + 1][y1];
            ret = min(ret, arr[i][y1]);
        }
        for (int i = y1; i < y2; i++) {
            arr[x2][i] = arr[x2][i + 1];
            ret = min(ret, arr[x2][i]);
        }
        for (int i = x2; i > x1 + 1; i--) {
            arr[i][y2] = arr[i - 1][y2];
            ret = min(ret, arr[i][y2]);
        }
        arr[x1 + 1][y2] = corner;
        answer.push_back(ret);
    }
    return answer;
}

결과

피드백

실수하기 쉬운 문제였는데 배열 인덱스를 잘 생각해줘야 했다.

profile
개발을 잘하고 싶은 사람

0개의 댓글