GitHubSeob

C++ / 프로그래머스 / 행렬 테두리 회전하기 본문

Programmers/Level 2

C++ / 프로그래머스 / 행렬 테두리 회전하기

GitHubSeob 2022. 4. 17.
문제

 

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;
}