본문 바로가기
coding/algorithm

[programmers] Lv.2 행렬 테두리 회전하기(c++)

by 눈부신음표 2022. 7. 1.
728x90
my full code
#include <string>
#include <vector>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    vector<vector<int>> matrix;
    int cnt = 1;
    for(int i=0; i<rows; i++){
        vector<int> temp;
        for(int j=0; j<columns; j++){
            temp.push_back(cnt);
            cnt++;
        }
        matrix.push_back(temp);
    }
    
    vector<int> dir_x = {0, 1, 0, -1};
    vector<int> dir_y = {1, 0, -1, 0};
    
    for(auto q: queries){
        int x1 = q[0]-1, y1 = q[1]-1, x2 = q[2]-1, y2 = q[3]-1;
        int i = x1, j = y1;
        int min_val = matrix[x1+1][y1];
        int bf = matrix[x1+1][y1];
        int temp, idx = 0;
        
        while(idx<4){
            temp = matrix[i][j];
            matrix[i][j] = bf;
            bf = temp;
            if(min_val > bf) min_val = bf;
            
            if(i+dir_x[idx] > x2 || i+dir_x[idx] < x1 ||
              j+dir_y[idx] > y2 || j+dir_y[idx] < y1) idx++;
            
            i += dir_x[idx];
            j += dir_y[idx];
        }
        
        answer.push_back(min_val);
    }
    
    return answer;
}

문제

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

728x90

[접근1]

행렬을 1부터 차례대로 넣어 초기화해준다.

for(int i=0; i<rows; i++){
    vector<int> temp;
    for(int j=0; j<columns; j++){
        temp.push_back(cnt);
        cnt++;
    }
    matrix.push_back(temp);
}

[접근2]

바꿀 숫자의 위치를 시계방향으로 이동시킬 벡터를 만들어준다.

vector<int> dir_x = {0, 1, 0, -1};
vector<int> dir_y = {1, 0, -1, 0};

[접근3]

query를 돌면서

각 query에 해당하는 테두리를 dir_x와 y를 이용해 돌아준다.

테두리를 벗어나면 방향을 바꿔주고, 모든 방향으로 다 돌았을 경우 while문을 빠져나온다.

돌면서 모든 숫자를 비교하여 동시에 최솟값도 찾는다.

for(auto q: queries){
    ... (값 선언 및 초기화)

    while(idx<4){
        temp = matrix[i][j];
        matrix[i][j] = bf;
        bf = temp;
        if(min_val > bf) min_val = bf;

        if(i+dir_x[idx] > x2 || i+dir_x[idx] < x1 ||
          j+dir_y[idx] > y2 || j+dir_y[idx] < y1) idx++;

        i += dir_x[idx];
        j += dir_y[idx];
    }

    answer.push_back(min_val);
}
728x90

댓글