프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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

+ Recent posts