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
[난이도] level2
[유형] 구현
[풀이]
2차원 배열의 특정 부분을 회전하는 순수 구현 문제입니다.
저는 이런 문제에서 주로 배열보다는 복사가 쉬운 2차원 vector를 이용해
복사본 tmp를 만들어서 업데이트 해주는 방식으로 구현합니다.
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
using namespace std;
using vvi=vector<vector<int>>;
int N,M;
int rotate(int y1,int x1,int y2,int x2,vector<vector<int>>& map){
int ret = 9e8;
vvi tmp = map;
for(int i=x1+1;i<=x2;i++) ret=min(ret,tmp[y1][i]=map[y1][i-1]);
for(int i=y1+1;i<=y2;i++) ret=min(ret,tmp[i][x2]=map[i-1][x2]);
for(int i=x2-1;i>=x1;i--) ret=min(ret,tmp[y2][i]=map[y2][i+1]);
for(int i=y2-1;i>=y1;i--) ret=min(ret,tmp[i][x1]=map[i+1][x1]);
map=tmp;
return ret;
}
vector<int> solution(int rows, int columns, vector<vector<int>> queries) {
vector<int> answer;
N=rows;
M=columns;
vvi map(N+1,vector<int>(M+1));
int k=0;
for(int y=1;y<=N;y++)
for(int x=1;x<=M;x++)
map[y][x] = ++k;
for(auto v : queries) answer.push_back(rotate(v[0],v[1],v[2],v[3],map));
return answer;
}
https://github.com/has2/Problem-Solving/blob/master/programmers/level2/행렬 테두리 회전하기.cpp
'Problem-Solving > Programmers' 카테고리의 다른 글
[프로그래머스][level2] 순위 검색 (C++) (0) | 2021.08.06 |
---|---|
[프로그래머스][level2] 메뉴 리뉴얼 (C++) (0) | 2021.08.06 |
[프로그래머스][level2] 거리두기 확인하기 (C++) (0) | 2021.08.06 |
[프로그래머스] Level2 - 가장 큰 수 (C++) (0) | 2020.07.28 |
[프로그래머스] Level2 - 큰 수 만들기(C++) (0) | 2020.07.14 |