https://programmers.co.kr/learn/courses/30/lessons/77485?language=cpp
풀이
주어진 문제에서는 행이 x좌표, 열이 y좌표이지만, 나는 (y, x)의 형식이 편해서 변경하여 품
진행 방향의 역순으로 변경
1. arr[y1][x1]의 값을 따로 저장
2. 진행 방향의 역순 : (y2, x1) -> (y1, x1), (y2, x2)->(y2, x1), (y1, x2)->(y2, x2), (y1, x2)->(y1, x1)으로 진행
매 변경마다 현재 값에 대해 최소값을 비교/갱신
3. arr[y1][x1+1]에 1에서 저장한 값으로 변경
#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int arr[101][101];
int turn(int x1, int y1, int x2, int y2) {
int MIN = 1e4;
int temp = arr[y1][x1];
for (int y = y1; y < y2; y++) {
MIN = min(MIN, arr[y][x1]);
arr[y][x1] = arr[y+1][x1];
}
for (int x = x1; x < x2; x++) {
MIN = min(MIN, arr[y2][x]);
arr[y2][x] = arr[y2][x + 1];
}
for (int y = y2; y > y1; y--) {
MIN = min(MIN, arr[y][x2]);
arr[y][x2] = arr[y - 1][x2];
}
for (int x = x2; x > x1; x--) {
MIN = min(MIN, arr[y1][x]);
arr[y1][x] = arr[y1][x - 1];
}
arr[y1][x1 + 1] = temp;
return MIN;
}
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
int idx = 1;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < columns; j++) {
arr[i][j] = idx++;
}
}
for (vector<int> now : queries) {
int y1 = now[0]-1;
int x1 = now[1]-1;
int y2 = now[2]-1;
int x2 = now[3]-1;
answer.push_back(turn(x1, y1, x2, y2));
}
return answer;
}
'알고리즘' 카테고리의 다른 글
BOJ 20165 - 인내의 도미노 장인 호석(C++) (1) | 2021.10.28 |
---|---|
BOJ 1655 - 가운데를 말해요(C++) (0) | 2021.10.22 |
BOJ 8090 - 택배(C++) (0) | 2021.10.19 |
BOJ 14888 - 연산자 끼워넣기(C++) (0) | 2021.10.16 |
BOJ 2110 - 공유기 설치(C++) (0) | 2021.10.14 |
댓글