본문 바로가기
알고리즘

Programmers - 행렬 테두리 회전하기

by 장중앙 2021. 10. 21.

https://programmers.co.kr/learn/courses/30/lessons/77485?language=cpp 

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr

 

 

풀이

주어진 문제에서는 행이 x좌표, 열이 y좌표이지만, 나는 (y, x)의 형식이 편해서 변경하여 품

진행 방향의 역순으로 변경

1. arr[y1][x1]의 값을 따로 저장

2. 진행 방향의 역순 : (y2, x1) -> (y1, x1), (y2, x2)->(y2, x1), (y1, x2)->(y2, x2), (y1, x2)->(y1, x1)으로 진행

    매 변경마다 현재 값에 대해 최소값을 비교/갱신

3. arr[y1][x1+1]에 1에서 저장한 값으로 변경 

 

 

 

#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int arr[101][101];

int turn(int x1, int y1, int x2, int y2) {
    int MIN = 1e4;
    int temp = arr[y1][x1];
    for (int y = y1; y < y2; y++) {
        MIN = min(MIN, arr[y][x1]);
        arr[y][x1] = arr[y+1][x1];
    }
    for (int x = x1; x < x2; x++) {
        MIN = min(MIN, arr[y2][x]);
        arr[y2][x] = arr[y2][x + 1];
    }
    for (int y = y2; y > y1; y--) {
        MIN = min(MIN, arr[y][x2]);
        arr[y][x2] = arr[y - 1][x2];
    }
    for (int x = x2; x > x1; x--) {
        MIN = min(MIN, arr[y1][x]);
        arr[y1][x] = arr[y1][x - 1];
    }
    arr[y1][x1 + 1] = temp;
    return MIN;
}


vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    int idx = 1;
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            arr[i][j] = idx++;
        }
    }

    for (vector<int> now : queries) {
        int y1 = now[0]-1;
        int x1 = now[1]-1;
        int y2 = now[2]-1;
        int x2 = now[3]-1;
        answer.push_back(turn(x1, y1, x2, y2));

    }
    return answer;
}

댓글