https://programmers.co.kr/learn/courses/30/lessons/77485
해당 문제는 Programmers의 2021 Dev-Matching: 웹 백엔드 개발자(상반기) 문제집에 있는 문제로 Level 2에 해당되는 문제입니다.
해당 문제는 queries에 직사각형 범위의 좌표가 주어지면 범위의 테두리에 있는 숫자들을 시계방향으로 한 칸씩 회전시키며 회전시키는 각 회차마다 가장 작은 수들을 구하는 게 목표입니다.
접근 방식
문제는 '테두리 회전 -> 회전한 수 중 가장 작은 수 구하기'의 과정을 queries 배열의 길이만큼 반복하면 됩니다.
저는 테두리 회전은 왼쪽 가장자리 -> 아래쪽 가장자리 -> 오른쪽 가장자리 -> 위쪽 가장자리 순으로 진행했습니다.
수평으로 이동시키는 경우는 slicing을 이용해서 구현했으며, 수직으로 이동시키는 경우는 반복문을 이용해서 구현했습니다.
각 회차마다 가장 작은 수는 단순 비교를 통해 구했습니다.
위의 접근 방식대로 적용한 코드는 아래와 같습니다.
전체 코드
제출 언어: Python 3
def rotation(mat, x1, y1, x2, y2):
savedNum = mat[x1][y1]
minNum = savedNum
numList = [ savedNum ]
# 왼쪽 가장자리 위로 한 칸씩 밀기
for j in range(x1, x2):
mat[j][y1] = mat[j+1][y1]
if minNum > mat[j+1][y1]:
minNum = mat[j+1][y1]
# 아래쪽 가장자리 왼쪽으로 한 칸씩 밀기
bottomList = mat[x2][y1+1:y2+1]
mat[x2][y1:y2] = bottomList
bottomMin = min(bottomList)
if minNum > bottomMin:
minNum = bottomMin
# 오른쪽 가장자리 아래로 한 칸씩 밀기
for j in range(x2, x1, -1):
mat[j][y2] = mat[j-1][y2]
if minNum > mat[j-1][y2]:
minNum = mat[j-1][y2]
# 위쪽 가장자리 오른쪽으로 한 칸씩 밀기
topList = mat[x1][y1:y2]
mat[x1][y1+1:y2+1] = topList
topMin = min(topList)
if minNum > topMin:
minNum = topMin
mat[x1][y1+1] = savedNum
return minNum
def solution(rows, columns, queries):
answer = []
mat = []
for i in range(1, rows+1):
mat.append([ (i-1) * columns + j for j in range(1, columns+1) ])
for query in queries:
x1, y1, x2, y2 = query
minNum = rotation(mat, x1-1, y1-1, x2-1, y2-1)
answer.append(minNum)
return answer
읽어 주셔서 감사합니다 :)
잘못된 부분이 있다면 댓글로 편히 알려주세요😊
'PS > Python' 카테고리의 다른 글
[백준] 15683 - 감시 (파이썬, Python) (0) | 2021.08.25 |
---|---|
[Programmers] 다단계 칫솔 판매(파이썬, Python) (2) | 2021.07.24 |
[Programmers] 로또의 최고 순위와 최저 순위 (파이썬, Python) (0) | 2021.07.18 |
[백준] 14891 - 톱니바퀴 (파이썬, Python) (0) | 2021.07.08 |
[백준] 2374 - 같은 수로 만들기 (파이썬, Python) (0) | 2021.07.06 |