본문 바로가기
  • 실행력이 모든걸 결정한다
Algorithm/기타 알고리즘

[시뮬레이션] 행렬 테두리 회전하기 - 2021 Dev-Matching

by 김코더 김주역 2022. 3. 27.
반응형

해결 방법

단순한 시뮬레이션 문제지만 한 가지 주의할 점이 있다. 그것은 칸에 있는 숫자를 저장하는 변수가 하나 필요하다는 것인데, 칸에 있는 숫자를 기억하지 않고 이동해버리면 값이 덮어 씌워져서 데이터가 날아가버릴 수 있기 때문이다. 그래서 현재의 좌표에 있는 숫자를 저장해뒀다가 다음 칸에 넣을 수 있는 save라는 변수를 하나 추가했다.

그리고 회전의 경우에는 상하좌우 4개의 테두리를 지나는 상황으로 나눠서 반복문을 수행했다. 각 반복문은 각 꼭짓점 사이에서 수행되는 것이다.

 

소스 코드

#include <vector>
using namespace std;
vector<vector<int>> v;

int rotate(vector<int> query) {
    int mini=10001;
    int x, y; // 현재 좌표 저장
    int save; // 현재 칸에 있는 숫자 저장
    int now; // 현재 칸에 있는 숫자 임시 저장
    x=query[0]-1;
    y=query[1]-1;
    save=v[query[0]][query[1]-1];
    
    // 윗 테두리 이동
    while(1){
        now = v[x][y];
        mini=min(mini, now);
        v[x][y]=save;
        save=now;
        if(y==query[3]-1) break;
        else y++;
    }
    
    // 오른쪽 테두리 이동
    x++;
    while(1){
        now = v[x][y];
        mini=min(mini, now);
        v[x][y]=save;
        save=now;
        if(x==query[2]-1) break;
        else x++;
    }
    
    // 아랫 테두리 이동
    y--;
    while(1){
        now = v[x][y];
        mini=min(mini, now);
        v[x][y]=save;
        save=now;
        if(y==query[1]-1) break;
        else y--;
    }
    
    // 왼쪽 테두리 이동
    x--;
    while(1){
        now = v[x][y];
        mini=min(mini, now);
        v[x][y]=save;
        save=now;
        if(x==query[0]-1) break;
        else x--;
    }
    return mini;
}

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    for(int i=0;i<rows;i++){
        vector<int> row;
        for(int j=0;j<columns;j++) row.push_back(i*columns+j+1); // 표 생성
        v.push_back(row);
    }
    for(int i=0; i<queries.size(); i++) answer.push_back(rotate(queries[i]));
    return answer;
}

 

테스트케이스 11개 모두 정답

 

 

반응형

댓글