문제
풀이
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<vector<int>> set_v(int a, int b){
vector < vector <int> > v;
int n = 1;
for(int i=0; i<a; i++){
vector<int> ve;
for(int j=0; j<b; j++){
ve.push_back(n++);
}
v.push_back(ve);
}
return v;
}
//x1, y1, x2, y2
//세로가 X, 가로가 Y
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
vector<vector<int>> v = set_v(rows, columns);
int min = 0;
int temp, before, len, x, y, x1, x2, y1,y2;
for(auto q : queries){
min = 100;
x1 = q[0]; y1 = q[1];
x2 = q[2]; y2 = q[3];
len = (x2-x1+1) * (y2-y1+1) - (x2-x1-1) * (y2-y1-1);
x = q[0]-1; y = q[1]-1;
before = v[x][y++];
min = before;
for(int i=0; i<len+1; i++){
temp = v[x][y];
v[x][y] = before;
before = temp;
if(x == q[0]-1){ // ->
if(y+1 > q[3]-1) x++;
else y++;
}
else if(y == q[3]-1){ // 밑
if(x+1 > q[2]-1) y--;
else x++;
}
else if(x == q[2]-1){ //<-
if(y-1 < q[1]-1) x--;
else y--;
}
else if(y == q[1]-1){// 위
if(x-1 < q[0]-1) y++;
else x--;
}
if(temp < min) min = temp;
}
if(temp < min) min = temp;
answer.push_back(min);
min = 100;
}
return answer;
}
다른 사람 풀이
#include <string>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
int field[101][101];
for (int i = 1 ; i <= rows ; i++)
{
for (int j = 1 ; j <= columns ; j++)
{
field[i][j] = (i - 1) * columns + j;
}
}
for (int i = 0 ; i < (int)queries.size() ; i++)
{
int mini = field[queries[i][0]][queries[i][1]];
int temp = field[queries[i][0]][queries[i][1]];
for (int j = queries[i][0] ; j < queries[i][2] ; j++)
{
field[j][queries[i][1]] = field[j + 1][queries[i][1]];
mini = min(mini, field[j][queries[i][1]]);
}
for (int j = queries[i][1] ; j < queries[i][3] ; j++)
{
field[queries[i][2]][j] = field[queries[i][2]][j + 1];
mini = min(mini, field[queries[i][2]][j]);
}
for (int j = queries[i][2] ; j > queries[i][0] ; j--)
{
field[j][queries[i][3]] = field[j - 1][queries[i][3]];
mini = min(mini, field[j][queries[i][3]]);
}
for (int j = queries[i][3] ; j > queries[i][1] ; j--)
{
field[queries[i][0]][j] = field[queries[i][0]][j - 1];
mini = min(mini, field[queries[i][0]][j]);
}
field[queries[i][0]][queries[i][1] + 1] = temp;
answer.push_back(mini);
}
return answer;
}
내 코드보다 훨씬 가독성도 좋고, 변수도 덜 사용했다.
나는 for문을 돌 때마다 if문을 사용해 위치를 확인했는데, 이 코드는 if문 없이 위치별로(?) 반복문을 돌며 배열을 회전시켰다. 따라서 나처럼 회전시키기 위해 변수가 두 개(temp, before)나 필요하지 않다!
가독성 좋은 코드... 나도 만들수 있도록 노력하자...
'Algorithm > Programers - C++' 카테고리의 다른 글
[프로그래머스] 프린터 - 스택/큐, max_element, min_element (0) | 2022.08.13 |
---|---|
[프로그래머스] 해시 - 전화번호 목록 (0) | 2022.06.21 |
[프로그래머스] 짝지어 제거하기 / stack(LIFO) (0) | 2022.03.30 |
[프로그래머스] 깊이/너비 우선 탐색(DFS/BFS) - 타겟 넘버 (0) | 2022.03.27 |
[프로그래머스] 힙(Heap) - 더 맵게 / 우선순위큐(priority_queue) (0) | 2022.03.23 |