프로그래머스 C++ 행렬 테두리 회전하기

DoooongDong·2023년 3월 25일
0
post-thumbnail

❓ 문제 설명

🐋 문제 해결 방법

이 문제는 단순 구현 문제입니다.


	for(int i=0; i<q.size(); i++){
        vector<int> tmp;
        vector<pair<int,int>> xy;
        int mn = 1e9;
        int sty = q[i][0];
        int stx = q[i][1];
        int eny = q[i][2];
        int enx = q[i][3];
        ...
   }

편의성을 위해 시작 좌표와 끝 좌표 변수를 만들어줍니다.

		// 오른쪽
        for(int i=stx; i<=enx; i++){
            tmp.push_back(board[sty][i]);
            mn = min(mn, board[sty][i]);
            xy.push_back({sty,i});
        }
        // 아래
        for(int i=sty+1; i<=eny; i++){
            tmp.push_back(board[i][enx]);
            mn = min(mn, board[i][enx]);
            xy.push_back({i, enx});
        }
        
        // 왼쪽
        for(int i=enx-1; i>= stx; i--){
            tmp.push_back(board[eny][i]);
            mn = min(mn, board[eny][i]);
            xy.push_back({eny, i});
        }
        
        // 위
        for(int i=eny-1; i>= sty+1; i--){
            tmp.push_back(board[i][stx]);
            mn = min(mn, board[i][stx]);
            xy.push_back({i, stx});
        }

시작점을 기준으로 시계 방향으로 오른쪽, 아래, 왼쪽, 위에 해당하는 숫자들을 tmp 벡터에 넣어줍니다.
xy 벡터는 시계 방향으로 한 칸 움직인 숫자들을 넣을 좌표를 저장합니다.

rotate(tmp.rbegin(), tmp.rbegin()+1, tmp.rend());

algorithm 헤더에 rotate 함수를 이용해서 오른쪽으로 한 칸 이동시켜주었습니다.
rotate(tmp.begin(), tmp.begin()+1, tmp.end()) 으로 하면 왼쪽으로 한 칸 이동시킵니다.

		for(int i=0; i<xy.size(); i++){
            board[xy[i].first][xy[i].second] = tmp[i];
        }

앞에서 저장해준 xy 좌표들을 순서대로 한 칸 이동한 숫자들을 넣어줍니다.

🛠️ 전체 코드

#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int board[104][104];
vector<int> solution(int r, int c, vector<vector<int>> q) {
    
    vector<int> answer;
    int cnt = 1;
    for(int i=1; i<= r; i++){
        for(int j=1; j<=c; j++){
            board[i][j] = cnt;
            cnt++;
        }
    }
    for(int i=0; i<q.size(); i++){
        vector<int> tmp;
        vector<pair<int,int>> xy;
        int mn = 1e9;
        int sty = q[i][0];
        int stx = q[i][1];
        int eny = q[i][2];
        int enx = q[i][3];
        // 오른쪽
        for(int i=stx; i<=enx; i++){
            tmp.push_back(board[sty][i]);
            mn = min(mn, board[sty][i]);
            xy.push_back({sty,i});
        }
        // 아래
        for(int i=sty+1; i<=eny; i++){
            tmp.push_back(board[i][enx]);
            mn = min(mn, board[i][enx]);
            xy.push_back({i, enx});
        }
        
        // 왼쪽
        for(int i=enx-1; i>= stx; i--){
            tmp.push_back(board[eny][i]);
            mn = min(mn, board[eny][i]);
            xy.push_back({eny, i});
        }
        
        // 위
        for(int i=eny-1; i>= sty+1; i--){
            tmp.push_back(board[i][stx]);
            mn = min(mn, board[i][stx]);
            xy.push_back({i, stx});
        }
        
        rotate(tmp.rbegin(), tmp.rbegin()+1, tmp.rend());
        
        for(int i=0; i<xy.size(); i++){
            board[xy[i].first][xy[i].second] = tmp[i];
        }
        
        answer.push_back(mn);
    }
    return answer;
}
profile
꺾이지 말자 :)

0개의 댓글