GitHubSeob
C++ / 프로그래머스 / 행렬 테두리 회전하기 본문
문제 |
https://programmers.co.kr/learn/courses/30/lessons/77485
코딩테스트 연습 - 행렬 테두리 회전하기
6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]
programmers.co.kr
문제풀이 |
한 쿼리를 탐색할때마다 nums라는 벡터를 만들어 시작지점부터 시계방향으로 움직여 해당 값을 저장하고,
시작지점에서 한칸 다음으로 움직인 부분부터 nums[idx]값들을 채워나가 회전한것처럼 만들것이다.
먼저 2차원 배열을 1부터 rows * columns 까지의 숫자들로 채운다.
주어진 좌표들은 (1, 1)부터 시작하므로 편의상 주어진 좌표들 -1을 한다.
int y(0), x(0);
vector<int>nums;
y = start_y;
for (x = start_x; x < end_x; ++x) nums.push_back(board[y][x]);
x = end_x;
for (y = start_y; y < end_y; ++y) nums.push_back(board[y][x]);
y = end_y;
for (x = end_x; x > start_x; --x) nums.push_back(board[y][x]);
x = start_x;
for (y = end_y; y > start_y; --y) nums.push_back(board[y][x]);
nums라는 벡터를 선언하여 시작지점부터 끝지점까지 값을 저장한다.
총 네 번의 반복문을 통해 시계방향으로 이동하며 해당 값들을 nums벡터에 저장한다.
int idx(0);
y = start_y;
for (x = start_x + 1; x <= end_x; ++x) board[y][x] = nums[idx++];
x = end_x;
for (y = start_y + 1; y <= end_y; ++y) board[y][x] = nums[idx++];
y = end_y;
for (x = end_x - 1; x >= start_x; --x) board[y][x] = nums[idx++];
x = start_x;
for (y = end_y - 1; y >= start_y; --y) board[y][x] = nums[idx++];
그 다음은 시계방향으로 회전한 값들을 다시 원래 보드에 저장하는 과정이다.
nums벡터에 값들을 입력할때는 시작지점부터 탐색하여 저장했지만,
이 과정에서는 시작지점부터 다음으로 한칸 이동한 지점부터 시작한다.
answer[i] = *min_element(nums.begin(), nums.end());
답인 answer벡터에는 이동한 값들 중 가장 최솟값을 저장해야하므로 *min_element함수를 이용하여 최솟값을 구해 저장한다.
코드 |
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer(queries.size(), 0);
vector<vector<int>>board(rows, vector<int>(columns, 0));
int num(1);
for (int y = 0; y < rows; ++y) {
for (int x = 0; x < columns; ++x) {
board[y][x] = num++;
}
}
for (int i = 0; i < queries.size(); ++i) {
int start_y(queries[i][0] - 1);
int start_x(queries[i][1] - 1);
int end_y(queries[i][2] - 1);
int end_x(queries[i][3] - 1);
int y(0), x(0);
vector<int>nums;
y = start_y;
for (x = start_x; x < end_x; ++x) nums.push_back(board[y][x]);
x = end_x;
for (y = start_y; y < end_y; ++y) nums.push_back(board[y][x]);
y = end_y;
for (x = end_x; x > start_x; --x) nums.push_back(board[y][x]);
x = start_x;
for (y = end_y; y > start_y; --y) nums.push_back(board[y][x]);
int idx(0);
y = start_y;
for (x = start_x+1; x <= end_x; ++x) board[y][x] = nums[idx++];
x = end_x;
for (y = start_y+1; y <= end_y; ++y) board[y][x] = nums[idx++];
y = end_y;
for (x = end_x-1; x >= start_x; --x) board[y][x] = nums[idx++];
x = start_x;
for (y = end_y-1; y >= start_y; --y) board[y][x] = nums[idx++];
answer[i] = *min_element(nums.begin(), nums.end());
}
return answer;
}
'Programmers > Level 2' 카테고리의 다른 글
C++ / 프로그래머스 / [1차] 뉴스 클러스터링 (0) | 2022.04.18 |
---|---|
C++ / 프로그래머스 / 메뉴 리뉴얼 (0) | 2022.04.17 |
C++ / 프로그래머스 / 짝지어 제거하기 (0) | 2022.04.14 |
C++ / 프로그래머스 / 더 맵게 (0) | 2022.04.14 |
C++ / 프로그래머스 / 기능개발 (0) | 2022.04.14 |