본문 바로가기

코딩테스트/프로그래머스

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

728x90
반응형


🔗 문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/77485#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


반응형
728x90

👩‍💻 코드

#include <string>
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    vector<vector<int>> matrix(rows, vector<int>(columns, 0));
    
    for(int r=0; r<rows; r++){
        for(int c=0; c<columns; c++){
            matrix[r][c] = r * columns + c + 1;
        }
    }
    
    for(int q=0; q<queries.size(); q++){
        int x1 = queries[q][0]-1;
        int y1 = queries[q][1]-1;
        int x2 = queries[q][2]-1;
        int y2 = queries[q][3]-1;
        
        int number = matrix[x1][y1];
        int minNumber = number;
        
        for (int y = y1+1; y <= y2; y++) {
            int temp = matrix[x1][y];
            matrix[x1][y] = number;
            minNumber = min(minNumber, matrix[x1][y]);
            number = temp;
        }
        
        for (int x = x1+1; x <= x2; x++){
            int temp = matrix[x][y2];
            matrix[x][y2] = number;
            minNumber = min(minNumber, matrix[x][y2]);
            number = temp;
        }
        
        for (int y = y2-1; y >= y1; y--) {
            int temp = matrix[x2][y];
            matrix[x2][y] = number;
            minNumber = min(minNumber, matrix[x2][y]);
            number = temp;
        }
        
        for (int x = x2-1; x >= x1; x--){
            int temp = matrix[x][y1];
            matrix[x][y1] = number;
            minNumber = min(minNumber, matrix[x][y1]);
            number = temp;
        }
        
        answer.push_back(minNumber);
    }
    
    return answer;
}

📝 풀이

rows x columns 크기의 행렬을 가로 방향으로 1씩 증가하는 값을 갖도록 초기화해줍니다.

 

행렬의 회전을 상단 가로, 우측 세로, 하단 가로, 좌측 세로 4구간으로 나누어 진행합니다.

상단 가로의 경우 오른쪽으로 한 칸씩 움직이고, 우측 세로의 경우 아래로 한 칸씩 움직입니다.

반대로 하단 가로의 경우 왼쪽으로 한 칸씩 움직이고, 좌측 세로의 경우 위로 한 칸씩 움직입니다.

 

움직일 때마다의 수를 최솟값인지 비교하여 회전이 끝난 후 answer에 최솟값을 push 합니다.

모든 쿼리에 들어있는 회전을 마치면 최종적으로 answer을 return 합니다.

728x90
반응형