문제 푼 날짜 : 2021-08-12
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77485
주어진 좌표를 두 꼭지점으로하여 직사각형을 그렸을 때, 직사각형의 네 변이 지나가는 좌표를 기준으로 시계방향으로 일일이 값을 한 칸씩 옮겨주었다.
직사각형의 우측상단 모서리의 값 (x1, y2)을 저장해두고, 윗변, 왼변, 아랫변, 오른변 순으로 시계방향으로 한 칸씩 옮겨준 다음, 마지막으로 저장해둔 값을 (x1 + 1, y2)에 대입해주었다.
#include <string>
#include <vector>
using namespace std;
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
int arr[101][101];
int num = 1;
for (int i = 1; i <= rows; i++) {
for (int j = 1; j <= columns; j++) {
arr[i][j] = num++;
}
}
for (auto q : queries) {
int x1 = q[0], y1 = q[1], x2 = q[2], y2 = q[3];
int corner = arr[x1][y2];
int ret = corner;
for (int i = y2; i > y1; i--) {
arr[x1][i] = arr[x1][i - 1];
ret = min(ret, arr[x1][i]);
}
for (int i = x1; i < x2; i++) {
arr[i][y1] = arr[i + 1][y1];
ret = min(ret, arr[i][y1]);
}
for (int i = y1; i < y2; i++) {
arr[x2][i] = arr[x2][i + 1];
ret = min(ret, arr[x2][i]);
}
for (int i = x2; i > x1 + 1; i--) {
arr[i][y2] = arr[i - 1][y2];
ret = min(ret, arr[i][y2]);
}
arr[x1 + 1][y2] = corner;
answer.push_back(ret);
}
return answer;
}
실수하기 쉬운 문제였는데 배열 인덱스를 잘 생각해줘야 했다.