티스토리 뷰
#include <string>
#include <vector>
using namespace std;
int arr[101][101];
int cal(int x1, int y1, int x2, int y2)
{
int min_num = arr[x1][y1];
int tmp = arr[x1][y1];
//시계 반대방향에서 끌어오기
for(int i=x1; i<x2; i++)
{
arr[i][y1] = arr[i+1][y1];
min_num = min(min_num, arr[i][y1]);
}
for(int i=y1; i<y2; i++)
{
arr[x2][i] = arr[x2][i+1];
min_num = min(min_num, arr[x2][i]);
}
for(int i=x2; i>x1; i--)
{
arr[i][y2] = arr[i-1][y2];
min_num = min(min_num, arr[i][y2]);
}
for(int i=y2; i>y1; i--)
{
arr[x1][i] = arr[x1][i-1];
min_num = min(min_num, arr[x1][i]);
}
arr[x1][y1 + 1] = tmp;
return min_num;
}
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
int num = 1;
for(int i=0; i<rows; i++)
{
for(int j=0; j<columns; j++)
{
arr[i][j] = num++;
}
}
for(int i=0; i<queries.size(); i++)
{
int x1 = queries[i][0]-1;
int y1 = queries[i][1]-1;
int x2 = queries[i][2]-1;
int y2 = queries[i][3]-1;
answer.push_back(cal(x1, y1, x2, y2));
}
return answer;
}
수를 입력받는 것이 아니기에, 먼저 행렬에 따라 배열 값을 채워준다.
그리고 주어진 좌표를 따로 생성해준다.
좌표의 경우 0부터 시작하기에 입력받은 좌표 값들은 전부 -1을 해주어야 한다.
회전의 경우 시계 반대 방향을 생각하여 뒤에서 부터 끌어오는 방식을 생각한다.
먼저 왼쪽 열에 대해 아래에서 위로 끌어올린다.
따라서 arr[i][y1] = arr[i+1][y1]이 된다.
더 뒤로 가서 아래쪽 행을 체크하자.
우측에서 왼쪽으로 땡기는 형태이다.
따라서 arr[x2][i] = arr[x2][i+1]이 된다.
더 뒤로가서 우측 열을 보면 위에서 아래로 끌어내린다.
따라서 arr[i][y2] = arr[i-1][y2]이다.
마지막으로 위쪽 행이다.
좌측에서 우측으로 땡기는 형태이다.
따라서 arr[i][y2] = arr[i-1][y2]이다.
그리고 이때 주의점이 있는데, 시작 점이 사라지는 것이다.
맨 처음에 아래에서 위로 떙기면서 바로 아래있던 값이 처음 위치의 값을 덮어쓰게 된다.
따라서 맨 처음 값을 저장해뒀다가, 계산을 모두 마치고 올바른 위치에 있도록 해주어야한다.
이 경우에는 원래 위치 값이 우측으로 1칸 이동한 위치기에 arr[x1][y1 + 1] = tmp; 처리를 해주어야한다.
처음 시작을 x1, y1이렇게 잡고 시작해서 풀이를 진행했지만, 실제 좌표를 고려하면 y1, x1으로 순서를 바꿔서 풀이하는게 이해가 쉬울 것 같다.
해당 코드를 보면 x의 값이 y축이고, y의 값이 x축으로 사용되고 있기 때문이다.
실제로 x1, y1 이렇게 잡고 시작하니 회전시키며 순간 좌표 이동을 헷갈려서 풀이에 시간이 더 소비되었다.
'프로그래머스 > 2레벨' 카테고리의 다른 글
[프로그래머스 2레벨] 테이블 해시 함수 (C++) (0) | 2025.03.13 |
---|---|
[프로그래머스 2레벨 ] 리코쳇 로봇 (C++) (0) | 2025.03.12 |
[프로그래머스 2레벨] 수식 최대화 (C++) (0) | 2025.03.04 |
[프로그래머스 2레벨] 괄호 변환 (C++) (0) | 2025.03.04 |
[프로그래머스 2레벨] 줄 서는 방법 (C++) (0) | 2025.03.02 |