[프로그래머스]
프로그래머스 행렬 테두리 회전하기 C++
Hevton
2023. 9. 20. 12:12
반응형
문제에서 주어진 대로 행렬을 회전하면 된다.
행렬 회전 문제는 보통 삼성 계열에서 겪었는데, 카카오에도 이러한 문제가 있네.
아무쪼록 한시간 이전에는 해결했는데.. !
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
vector<vector<int>> m(rows, vector<int>(columns, 0));
for(int i = 0; i < rows; i++) {
for(int j = 0; j < columns; j++) {
m[i][j] = (i * columns) + j + 1;
}
}
for(auto query : queries) {
int min = 1000000;
int i = query[0] - 1;
int j = query[1] - 1;
int width = query[3] - query[1];
int height = query[2] - query[0];
int move = m[i][j];
int moved = 0;
// move 8
// moved 9
for(int count = 0; count < width; count++) {
moved = m[i][j + 1];
m[i][j + 1] = move;
move = moved;
j++;
if(move < min) min = move;
}
for(int count = 0; count < height; count++) {
moved = m[i + 1][j];
m[i + 1][j] = move;
move = moved;
i++;
if(move < min) min = move;
}
for(int count = 0; count < width; count++) {
moved = m[i][j - 1];
m[i][j - 1] = move;
move = moved;
j--;
if(move < min) min = move;
}
for(int count = 0; count < height; count++) {
moved = m[i - 1][j];
m[i - 1][j] = move;
move = moved;
i--;
if(move < min) min = move;
}
answer.push_back(min);
}
return answer;
}
이를 조금 더 짧은 코드로 풀 수도 있다.
위 방법은 시계방향으로 순서대로 하나씩 돌리는 방식을 썼고
아래 방법은 반시계방향으로 밀리는 방식을 썼다.
다시 풀었다.
#include <string>
#include <vector>
#include <iostream>
#define MIN(a,b) ((a<=b)?a:b)
using namespace std;
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer; // 정답
vector<vector<int>> m(rows, vector<int>(columns, 0)); // 맵
// 숫자 담아놓기
for(int i = 0; i < rows; i++) {
for(int j = 0; j < columns; j++) {
m[i][j] = (i * columns) + j + 1;
}
}
for(auto query : queries) {
int i = query[0] - 1;
int j = query[1] - 1;
int min = m[i][j];
int temp = m[i][j];
// 아래에서 위로
for(i = query[0] - 1; i < query[2] - 1; i++) {
m[i][j] = m[i + 1][j];
min = MIN(min, m[i + 1][j]);
}
for(; j < query[3] - 1; j++) {
m[i][j] = m[i][j + 1];
min = MIN(min, m[i][j + 1]);
}
for(; i > query[0] - 1; i--) {
m[i][j] = m[i - 1][j];
min = MIN(min, m[i - 1][j]);
}
for(; j > query[1] - 1; j--) {
m[i][j] = m[i][j - 1];
min = MIN(min, m[i][j - 1]);
}
m[i][j + 1] = temp;
answer.push_back(min);
}
return answer;
}
반응형