[C++로 풀이] 행렬 테두리 회전하기 ⭐⭐

Date:     Updated:

카테고리:

태그:

📌 행렬 테두리 회전하기

난이도 ⭐⭐

🚀 문제

image

image

image

image


🚀 내 풀이 ⭕

#include <string>
#include <vector>

using namespace std;

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

    for (auto query : queries) {
        vector<vector<int>> temp(board);
        int min = 10000;
        // 위의 ㅡ 부분
        for (int j = query[1] + 1; j <= query[3]; ++j) {
            temp[query[0]][j] = board[query[0]][j - 1];
            if (min > temp[query[0]][j]) min = temp[query[0]][j];
        }   
        // 오른쪽 ㅣ 부분
        for (int i = query[0] + 1; i <= query[2]; ++i) {
            temp[i][query[3]] = board[i - 1][query[3]];
            if (min > temp[i][query[3]]) min = temp[i][query[3]];
        }      
        // 아래의 ㅡ 부분
        for (int j = query[3] - 1; j >= query[1]; --j) {
            temp[query[2]][j] = board[query[2]][j + 1];
            if (min > temp[query[2]][j]) min = temp[query[2]][j];
        }
        // 왼쪽의 ㅣ 부분
        for (int i = query[2] - 1; i >= query[0]; --i) {
            temp[i][query[1]] = board[i + 1][query[1]];
            if (min > temp[i][query[1]]) min = temp[i][query[1]];
        }
        board = temp;
        answer.push_back(min);
    }

    return answer;
}

직관적으로 진짜 시계방향으로 하나 하나 다 옮겨주는식으로 풀이했다..ㅎㅎ 그 과정에서 최소값도 계속해서 업데이트 하였다. 다만 시계방향으로 하나 하나 옮겨줄 때 다음과 같은 상황을 막기 위해 원본 테이블을 복사한 temp로 수정을 진행하였다. 2 3 4 👉 2 2 4 이 경우엔 3 을 잃어버리게 된다. 4 자리에 3 을 옮겨주어야 하는데 3을 2로 덮어버려서 잃어버리는 문제가 발생한다. 그래서 원본 테이블을 복사한 temp로 시계방향 회전을 진행하고 원본 테이블 원소에서 가져와 덮어쓰기 했다. 하나의 쿼리 과정이 모두 끝난 후 원본 테이블을 temp 로 덮어씌워주면 된다.



🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우 
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄

맨 위로 이동하기

Programmers 카테고리 내 다른 글 보러가기

댓글 남기기