[C++로 풀이] 행렬 테두리 회전하기 ⭐⭐
카테고리: Programmers
태그: Coding Test Algorithm
📌 행렬 테두리 회전하기
난이도 ⭐⭐
🚀 문제
🚀 내 풀이 ⭕
#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
로 덮어씌워주면 된다.
🌜 개인 공부 기록용 블로그입니다. 오류나 틀린 부분이 있을 경우
언제든지 댓글 혹은 메일로 지적해주시면 감사하겠습니다! 😄
댓글 남기기