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
문제 설명
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.
- x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.
다음은 6 x 6 크기 행렬의 예시입니다.
![](https://blog.kakaocdn.net/dn/JNvFG/btrpzKZxlGU/EkvfEi5mfx47GyfkAx18UK/img.png)
이 행렬에 (2, 2, 5, 4) 회전을 적용하면, 아래 그림과 같이 2행 2열부터 5행 4열까지 영역의 테두리가 시계방향으로 회전합니다. 이때, 중앙의 15와 21이 있는 영역은 회전하지 않는 것을 주의하세요.
![](https://blog.kakaocdn.net/dn/EP8Ss/btrpusFRMva/b5zZno2gDGvbWCJMq9fxl0/img.png)
행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.
제한사항
- rows는 2 이상 100 이하인 자연수입니다.
- columns는 2 이상 100 이하인 자연수입니다.
- 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
- 즉, 아무 회전도 하지 않았을 때, i 행 j 열에 있는 숫자는 ((i-1) x columns + j)입니다.
- queries의 행의 개수(회전의 개수)는 1 이상 10,000 이하입니다.
- queries의 각 행은 4개의 정수 [x1, y1, x2, y2]입니다.
- x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
- 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columns입니다.
- 모든 회전은 순서대로 이루어집니다.
- 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.
입출력 예시rowscolumnsqueriesresult
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] |
100 | 97 | [[1,1,100,97]] | [1] |
입출력 예 설명
입출력 예 #1
- 회전을 수행하는 과정을 그림으로 표현하면 다음과 같습니다.
입출력 예 #2
- 회전을 수행하는 과정을 그림으로 표현하면 다음과 같습니다.
입출력 예 #3
- 이 예시에서는 행렬의 테두리에 위치한 모든 칸들이 움직입니다. 따라서, 행렬의 테두리에 있는 수 중 가장 작은 숫자인 1이 바로 답이 됩니다.
풀이
- 꼭지점을 만나면 x, y좌표 조절
- 꼭지점은 플래그로 조절
def default_matricx(rows, columns) :
matricx = []
num = 0
for i in range(rows) :
temp = []
for j in range(columns) :
num += 1
temp.append(num)
matricx.append(temp)
return matricx
def inner_matricx(matricx, position) :
x1 = position[0]-1
y1 = position[1]-1
x2 = position[2]-1
y2 = position[3]-1
pos = [[x1,y1], [x1,y2], [x2,y2], [x2,y1]] #[x1,y1] : 왼쪽 위, [x1,y2] : 오른쪽 위, [x2,y2] : 오른쪽 아래, [x2,y1]
flag = 0
px, py = x1, y1 #이전 값 기억용 좌표
prev = matricx[px][py] #이전 값 기억
x, y = x1, y1+1 #회전 시작 점
min = None
while(flag < 4): #플래그가 4가 되면 반복문은 종료
if [x, y] in pos: #각 꼭지점에 도달하면 플래그 증가
flag+=1
tmp = prev #이전 값을 먼저 템프로 옮김
prev = matricx[x][y] #다음 값은
if min is None or min > prev:
min = prev
matricx[x][y] = tmp
if flag == 0: #오른쪽 위 까지
y+=1
if flag == 1: #오른쪽 아래 까지
x+=1
if flag == 2: #왼쪽 아래까지
y-=1
if flag == 3: #오른쪽 위까지
x-=1
return min
def solution(rows, columns, queries):
matricx = default_matricx(rows, columns)
result=[]
for query in queries:
result.append(inner_matricx(matricx, query))
return result
'코테풀이 > 구현' 카테고리의 다른 글
공기청정기-2차원 밀기(이차원 리스트 시계방향 테두리 회전) (0) | 2022.02.15 |
---|---|
[백준 | 실버5] 2578:빙고 (0) | 2022.01.06 |
[알고리즘랩스] 3. 완전탐색_offset(4방향 체크, 구현) (0) | 2022.01.06 |
[알고리즘랩스]반복문&배열_array3(대각선 출력) (0) | 2022.01.04 |
[랩스 | 구현] 반복문&배열_숫자피라미드(별찍기, 피라미드) (0) | 2022.01.04 |