프로그래머스/2레벨
[프로그래머스/C++] 행렬 테두리 회전하기
Koalitsiya
2024. 3. 10. 20:08
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
- 행렬에서 주어진 영역의 테두리를 시계 방향으로 회전
- 이를 수행 후 위치가 바뀐 숫자들 중 가장 작은 숫자를 배열에 담음
- 위를 반복
> 처음에 보고 복잡하게 생각했는데 위에 생각만큼 어려운 문제는 아니었다.
> 예시 기준으로 위, 오른쪽, 아래, 왼쪽 순서로 배열에 값과 좌표를 담으며 가장 작은 숫자를 찾음
> 값이 들어있는 배열의 원소들을 rotate 함수를 통해 오른쪽으로 하나씩 이동
> 다시 좌표에 순서대로 값들을 저장
> 위를 반복
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int table[101][101];
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
int num = 1;
// 행렬 생성
for(int i = 1; i <= rows; i++)
for(int j = 1; j <= columns; j++)
table[i][j] = num++;
for(int i = 0; i < queries.size(); i++) {
// 값 저장용
vector<int> tmp;
// 좌표 저장용
vector<pair<int, int>> coordinate;
int minVal = 10001;
// 사용하기 쉽게 좌표 변수 생성
int startY = queries[i][0];
int startX = queries[i][1];
int endY = queries[i][2];
int endX = queries[i][3];
// 위쪽
for(int i = startX; i <= endX; i++) {
tmp.push_back(table[startY][i]);
//최솟값 찾기
minVal = min(minVal, table[startY][i]);
coordinate.push_back({startY, i});
}
// 오른쪽
for(int i = startY + 1; i <= endY ; i++) {
tmp.push_back(table[i][endX]);
//최솟값 찾기
minVal = min(minVal, table[i][endX]);
coordinate.push_back({i, endX});
}
// 아래쪽
for(int i = endX - 1; i >= startX; i--) {
tmp.push_back(table[endY][i]);
//최솟값 찾기
minVal = min(minVal, table[endY][i]);
coordinate.push_back({endY, i});
}
// 왼쪽
for(int i = endY - 1; i >= startY + 1; i--) {
tmp.push_back(table[i][startX]);
//최솟값 찾기
minVal = min(minVal, table[i][startX]);
coordinate.push_back({i, startX});
}
// 값들을 오른쪽으로 한 칸씩 옮기기
rotate(tmp.rbegin(), tmp.rbegin() + 1, tmp.rend());
// 좌표에 값을 순서대로 저장
for(int i = 0; i < coordinate.size(); i++)
table[coordinate[i].first][coordinate[i].second] = tmp[i];
// 최솟값 저장
answer.push_back(minVal);
}
return answer;
}