프로그래머스 - 행렬 테두리 회전하기 (Lv.2)
1 minute read
문제 링크
문제 설명
- rows x columns 크기인 행렬이 주어진다. 행렬의 원소는 1행부터 열을 따라 1부터 채워진다.
- 행렬은 테두리만 시계방향으로 회전을 하고, 각 회전은 (x1, y1, x2, y2)의 좌표 정보를 가지고 x1행 y1열부터 x2행 y2열까지의 영역의 테두리에서 이루어진다.
- 각 회전에서 위치가 바뀌는 원소의 최솟값을 배열에 담아서 반환하라.
문제 접근
- 테두리 회전이므로 가로선 2개, 세로선 2개 영역만 회전을 시켜주면 된다.
- 겹치는 영역에 주의한다.
구현(All Pass)
#include <string>
#include <vector>
#include <memory.h>
#include <iostream>
using namespace std;
int n, m;
int board[101][101];
int rotateBoard(int x1, int y1, int x2, int y2){
int nboard[101][101];
memcpy(nboard, board, sizeof(board));
int minVal = 1e9;
// 가로선
for(int c=y1; c<=y2; c++){
minVal = min(minVal, board[x1][c]);
minVal = min(minVal, board[x2][c]);
if(c==y1) {
nboard[x1][c] = board[x1+1][c];
nboard[x2][c] = board[x2][c+1];
}
else if(c==y2){
nboard[x1][c] = board[x1][c-1];
nboard[x2][c] = board[x2-1][c];
}
else{
nboard[x1][c] = board[x1][c-1];
nboard[x2][c] = board[x2][c+1];
}
}
// 세로선 (중간 부분만)
for(int r=x1+1; r<=x2-1; r++){
minVal = min(minVal, board[r][y1]);
minVal = min(minVal, board[r][y2]);
nboard[r][y1] = board[r+1][y1];
nboard[r][y2] = board[r-1][y2];
}
memcpy(board, nboard, sizeof(nboard));
// cout << minVal << " ";
return minVal;
}
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
n = rows; m = columns;
// init board
int val = 1;
for(int r=1; r<=n; r++){
for(int c=1; c<=m; c++)
board[r][c] = val++;
}
for(int i=0; i<queries.size(); i++){
answer.push_back(rotateBoard(queries[i][0],queries[i][1],queries[i][2],queries[i][3]));
}
return answer;
}
Leave a comment