[프로그래머스] 행렬 테두리

klean·2021년 4월 29일
1

문제요약

직사각형 영역이 주어지면 해당 영역의 테두리를 시계방향으로 한 칸씩 회전시킵니다.
회전시키는 query를 여러개 줄테니 시뮬레이션 하고, 각 회전이벤트마다 가장 큰 멤버를 반환하시오.

아이디어

시뮬레이션
그리고 회전마다 잘 결과물이 뽑혔는지 프린트 하는것도 필요한 것 같다.

코드 py

def solution(rows, columns, queries):
    answer = []
    tab = [[0 for col in range(columns+1)] for row in range(rows+1)]
    
    val = 1
    for i in range(1, rows+1):
        for j in range(1, columns+1):
            tab[i][j] = val
            val+=1
    
    for query in queries:
        x1,y1,x2,y2 = query

        seed = tab[x1][y1]
        min_mem = seed
        for x in range(x1,x2):
            tab[x][y1] = tab[x+1][y1]
            min_mem = min(min_mem, tab[x][y1])
        for y in range(y1, y2):
            tab[x2][y] = tab[x2][y+1]
            min_mem = min(min_mem, tab[x2][y])
        for x in range(x2,x1,-1):
            tab[x][y2] = tab[x-1][y2]
            min_mem = min(min_mem, tab[x][y2])
        for y in range(y2, y1,-1):
            tab[x1][y] =tab[x1][y-1]
            min_mem = min(min_mem, tab[x1][y])
        tab[x1][y1+1] = seed
        
        answer.append(min_mem)
    
    return answer

코드 cpp

#include <string>
#include <vector>
#include<iostream>
#include<math.h>
using namespace std;
int tab[101][101];

vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
    vector<int> answer;
    int val =1;
    for(int i = 1;i<=rows;i++){
        for(int j = 1;j<=columns;j++){
            tab[i][j] =val++;
        }
    }
    
    for(int ctr =0;ctr<queries.size();ctr++){
        int p[4];
        for(int i = 0;i<4;i++) p[i] = queries[ctr][i];
        int x1 = p[0],y1 = p[1],x2 = p[2],y2 = p[3];
        int seed = tab[p[0]][p[1]];
        int min_mem = seed;
        for(int i = x1;i<x2;i++){
            tab[i][y1] = tab[i+1][y1];
            min_mem = min(min_mem,tab[i][y1]);
        }
        for(int j = y1;j<y2;j++){
            tab[x2][j] = tab[x2][j+1];
            min_mem = min(min_mem,tab[x2][j]);
        }
        for(int i = x2;i>x1;i--){
            tab[i][y2] = tab[i-1][y2];
            min_mem = min(min_mem,tab[i][y2]);
        }
        for(int j = y2;j>y1;j--){
            tab[x1][j] = tab[x1][j-1];
            min_mem = min(min_mem,tab[x1][j]);
        }
        tab[x1][y1+1] = seed;
        //min_mem = min(min_mem, tab[x1][y1+1]); //없어도 됨 seed에서 이미 검사했기 때문
        //print_tab(rows, columns);
        
        answer.push_back(min_mem);
    }
    
    return answer;
}

0개의 댓글