[프로그래머스]

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

Hevton 2023. 9. 20. 12:12
반응형

 

문제에서 주어진 대로 행렬을 회전하면 된다.

행렬 회전 문제는 보통 삼성 계열에서 겪었는데, 카카오에도 이러한 문제가 있네.

 

아무쪼록 한시간 이전에는 해결했는데.. !

#include <string>
#include <vector>
#include <iostream>

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    
    vector<int> answer;

    vector<vector<int>> m(rows, vector<int>(columns, 0));
    
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns; j++) {
            m[i][j] = (i * columns) + j + 1;
        }
    }
    
    
    for(auto query : queries) {
        
        int min = 1000000;
        
        int i = query[0] - 1;
        int j = query[1] - 1;
        
        int width = query[3] - query[1];
        int height = query[2] - query[0];
        
        
        int move = m[i][j];
        int moved = 0;
        
        // move 8
        // moved 9
        for(int count = 0; count < width; count++) {
            moved = m[i][j + 1];
            m[i][j + 1] = move;
            move = moved;
            j++;
            if(move < min) min = move;
        }
        
        for(int count = 0; count < height; count++) {
            moved = m[i + 1][j];
            m[i + 1][j] = move;
            move = moved;
            i++;
            if(move < min) min = move;
        }
        
        for(int count = 0; count < width; count++) {
            moved = m[i][j - 1];
            m[i][j - 1] = move;
            move = moved;
            j--;
            if(move < min) min = move;
        }
        
        for(int count = 0; count < height; count++) {
            moved = m[i - 1][j];
            m[i - 1][j] = move;
            move = moved;
            i--;
            if(move < min) min = move;
        }
        
        answer.push_back(min);
        
    }

    return answer;
    
}

이를 조금 더 짧은 코드로 풀 수도 있다.

 

위 방법은 시계방향으로 순서대로 하나씩 돌리는 방식을 썼고

아래 방법은 반시계방향으로 밀리는 방식을 썼다.

 

다시 풀었다.

#include <string>
#include <vector>
#include <iostream>
#define MIN(a,b) ((a<=b)?a:b)

using namespace std;

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    
    vector<int> answer; // 정답
    vector<vector<int>> m(rows, vector<int>(columns, 0)); // 맵
    
    // 숫자 담아놓기
    for(int i = 0; i < rows; i++) {
        for(int j = 0; j < columns; j++) {
            m[i][j] = (i * columns) + j + 1;
        }
    }
    
    
    for(auto query : queries) {
                
        int i = query[0] - 1;
        int j = query[1] - 1;
        
        int min = m[i][j];
        int temp = m[i][j];
        
        // 아래에서 위로
        for(i = query[0] - 1; i < query[2] - 1; i++) {
            m[i][j] = m[i + 1][j];
            min = MIN(min, m[i + 1][j]);
        }
            
        for(; j < query[3] - 1; j++) {
            m[i][j] = m[i][j + 1];
            min = MIN(min, m[i][j + 1]);
        }
        
        for(; i > query[0] - 1; i--) {
            m[i][j] = m[i - 1][j];
            min = MIN(min, m[i - 1][j]);
        }
        
        for(; j > query[1] - 1; j--) {
            m[i][j] = m[i][j - 1];
            min = MIN(min, m[i][j - 1]);
        }
        
        m[i][j + 1] = temp;
        
        answer.push_back(min);
    }

    return answer;
    
}
반응형