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

Jeanine·2022년 5월 28일
0

programmers

목록 보기
1/5
post-thumbnail
post-custom-banner

💻 C++ 기반

코딩테스트 연습 - 행렬 테두리 회전하기
https://programmers.co.kr/learn/courses/30/lessons/77485?language=cpp

✔️ 시작점의 원소를 미리 저장해두기
✔️ 회전하는 방향의 '반대 방향'으로 탐색하면서 2차원 배열 갱신
✔️ 아이디어 참고용(링크)


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

#define MAX 101

using namespace std;

int board[MAX][MAX];
int dirRow[4] = {0, -1, 0, 1}; // 동북서남
int dirCol[4] = {1, 0, -1, 0};

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    for (int i = 1; i <= rows; i++)
    {
        for (int j = 1; j <= columns; j++)
        {
            board[i][j] = (i - 1) * columns + j;
        }
    }
    
    for (int i = 0; i < queries.size(); i++)
    {
        int x1 = queries[i][0];
        int y1 = queries[i][1];
        int x2 = queries[i][2];
        int y2 = queries[i][3];
        
        int sz = (x2 - x1 + y2 - y1) * 2;
        
        int dir = 2;
        int curRow = x1;
        int curCol = y1;
        
        vector<int> v;
        int temp = board[curRow][curCol];
        for (int j = 0; j < sz; j++)
        {
            if (curRow == x1 && curCol == y1 || curRow == x2 && curCol == y1 || curRow == x2 && curCol == y2 || curRow == x1 && curCol == y2)
            {
                dir = (dir + 1) % 4; 
            }
            
            if (j == sz - 1)
            {
                v.push_back(temp);
                board[curRow][curCol] = temp;
            }
            else
            {
                int nextRow = curRow + dirRow[dir];
                int nextCol = curCol + dirCol[dir];
                v.push_back(board[nextRow][nextCol]);
                board[curRow][curCol] = board[nextRow][nextCol];
                curRow = nextRow;
                curCol = nextCol;
            }
        }
        sort(v.begin(), v.end());
        answer.push_back(v[0]);
    }
    return answer;
}
profile
Grow up everyday
post-custom-banner

0개의 댓글