본문 바로가기

Algorithm/Implementation

(C++) - 프로그래머스(2021 Dev-Matching: 웹 백엔드 개발자(상반기)) : 행렬 테두리 회전하기

반응형

programmers.co.kr/learn/courses/30/lessons/77485

 

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

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

구현문제였습니다.

 

풀이방법

 돌릴 때 배열의 규칙을 찾아서 회전시키면 됩니다.

 1. 먼저 x1,y1의 값은 x라는 변수에 저장합니다.

 

 2. y1+1 ~ y2열까지 확인하면서 tmp를 선언해 arr[x1][i]값을 먼저 저장후 이전 x를 arr[x1][i]에 넣고 x를 tmp로 갱신해줍니다.

 

 3. 같은 방식으로 우측 세로선, 하단 가로선, 좌측 세로선으로 확인하며 배열을 돌리면 됩니다.

 

 4. 돌렸던 값들의 최소값을 answer에 push해줍니다.

Code

#include <bits/stdc++.h>
using namespace std;
int arr[101][101];

int rotate(int x1, int y1, int x2, int y2){
    vector <int> num;
    int ans = arr[x1][y1];
    int x = arr[x1][y1];
    for(int i = y1 + 1; i <= y2; i++){
        int tmp = arr[x1][i];
        ans = min(ans,tmp);
        arr[x1][i] = x;
        x = tmp;
    }
    for(int i = x1 + 1; i <= x2; i++){
        int tmp = arr[i][y2];
        ans = min(ans,tmp);
        arr[i][y2] = x;
        x = tmp;
    }
    for(int i = y2-1; i >= y1; i--){
        int tmp = arr[x2][i];
        ans = min(ans,tmp);
        arr[x2][i] = x;
        x = tmp;
    }

    for(int i = x2-1; i >= x1; i--){
        int tmp =arr[i][y1];
        ans = min(ans,tmp);
        arr[i][y1] = x;
        x = tmp;
    }
    return ans;
}

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

    for(int i = 0; i < queries.size(); i++){
        int x1 = queries[i][0];
        int y1 = queries[i][1];
        int x2 = queries[i][2];
        int y2 = queries[i][3];
        answer.push_back(rotate(x1,y1,x2,y2));
    }
    return answer;
}