반응형
프로그래머스 행렬 테두리 회전하기를 파이썬으로 풀어보겠다.
이번 문제의 난이도는 레벨 2고 2021년 문제다.
예전 문제와 비교를 해보면 최신 문제가 확실히 약간 더 난이도가 있다.
문제
행렬의 일부분에서 테두리만 시계방향 회전시키는 문제이다.
회전시킬 때 가장 작은 값을 결과에 더해주면 된다.
구현
다른 방법은 생각나지 않았다.
정직하게 2차원 리스트를 생성하고
쿼리를 읽어서 그 리스트의 부분을 회전시키면서
min값을 찾도록 했다.
코드
import math
def solution(rows, columns, queries):
arr = []
for i in range(rows):
temp=[]
for j in range(columns):
temp.append((j+1)+(i*columns))
arr.append(temp)
answer =[]
for x1,y1,x2,y2 in queries:
minval=math.inf
temp=math.inf
for i in range(y1-1, y2):
temp, arr[x1-1][i] = arr[x1-1][i], temp
minval = min(minval, temp)
for j in range(x1, x2):
temp, arr[j][y2-1] = arr[j][y2-1], temp
minval = min(minval, temp)
for k in range(y2-2, y1-2, -1):
temp, arr[x2-1][k] = arr[x2-1][k], temp
minval = min(minval, temp)
for l in range(x2-2, x1-2, -1):
temp, arr[l][y1-1] = arr[l][y1-1], temp
minval = min(minval, temp)
answer.append(minval)
return answer
구현에서 쓴 것과 같이
위의 반복문에서 리스트를 생성하고
아래 반복문에서 min값을 찾으며 값을 치환하도록 처리하고
min값을 결과에 추가했다.
다른 풀이
로직은 비슷하지만 괜찮은 풀이가 있어서 가져와 봤다.
def solution(rows, columns, queries):
answer = []
board = [[i+(j)*columns for i in range(1,columns+1)] for j in range(rows)]
# print(board)
for a,b,c,d in queries:
stack = []
r1, c1, r2, c2 = a-1, b-1, c-1, d-1
for i in range(c1, c2+1):
stack.append(board[r1][i])
if len(stack) == 1:
continue
else:
board[r1][i] = stack[-2]
for j in range(r1+1, r2+1):
stack.append(board[j][i])
board[j][i] = stack[-2]
for k in range(c2-1, c1-1, -1):
stack.append(board[j][k])
board[j][k] = stack[-2]
for l in range(r2-1, r1-1, -1):
stack.append(board[l][k])
board[l][k] = stack[-2]
answer.append(min(stack))
return answer
우선 인덱스 값들에 -1 처리를 해주어 코드를 깔끔하게 해 줬고
stack을 사용해서 값을 치환해주고
그 스택에서 min으로 깔끔하게 결과에 추가해준 부분 도 좋았다.
이 문제 자체가 뭔가 pythonic하게 풀기는 힘든 문제라
풀이 방식이 다들 비슷하게 되는 것 같다.
반응형
'Coding Test > Python' 카테고리의 다른 글
[프로그래머스] 메뉴 리뉴얼 Python Code (0) | 2022.09.01 |
---|---|
[프로그래머스] 튜플 Python Code (0) | 2022.09.01 |
[프로그래머스] 짝지어 제거하기 Python Code (0) | 2022.08.31 |
[프로그래머스] 타겟 넘버 Python Code (0) | 2022.08.30 |
[프로그래머스] 올바른 괄호 Python Code (0) | 2022.08.30 |
댓글