알고리즘 문제풀이/프로그래머스

[프로그래머스/Level 2] 행렬 테두리 회전하기 (C++)

노력의천재 2021. 4. 29. 15:45

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

삼성 역량 테스트 기출문제였던 백준 17144번 미세먼지 안녕과 비슷한 문제였습니다. 

 

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

입력받은 좌표중 첫번째 좌표를 tmp 변수에 저장한 후, 이를 기준으로 값을 한칸씩 계속 땡겨가며 회전 처리를 해주었습니다. 마지막 부분만 tmp를 덮어 씌어주면 됩니다. 이런 방법으로 회전 처리를 하고, 할 때마다 최소값을 갱신해가면 쉽게 문제를 해결할 수 있습니다.

 

#include <string>
#include <vector>
using namespace std;

int map[101][101], num = 1;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns; j++) {
            map[i][j] = num++;
        }
    }
    
    for(auto q : queries) {
        int sx = q[0] - 1, sy = q[1] - 1;
        int ex = q[2] - 1, ey = q[3] - 1;
        int tmp = map[sx][sy];
        int minn = 2147000000;
        
        for(int i = sx; i < ex; i++) {
            map[i][sy] = map[i + 1][sy];
            minn = min(minn, map[i][sy]);
        }
        
        for(int i = sy; i < ey; i++) {
            map[ex][i] = map[ex][i + 1];
            minn = min(minn, map[ex][i]);
        }
        
        for(int i = ex; i > sx; i--) {
            map[i][ey] = map[i - 1][ey];
            minn = min(minn, map[i][ey]);
        }
        
        for(int i = ey; i > sy; i--) {
            map[sx][i] = map[sx][i - 1];
            minn = min(minn, map[sx][i]);
        }
        
        map[sx][sy + 1] = tmp;
        minn = min(minn, map[sx][sy + 1]);
        answer.push_back(minn);
    }
    
    return answer;
}