728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 설명
반응형
2. 풀이과정
해당 문제는 알고리즘을 사용하지 않고 우선 차근차근 문제를 살펴보며 문제에서 실행되는 행동을 그대로 동작할 수 있도록 코드를 작성해 본다.
초기 행렬을 생성하는 함수, 회전하는 숫자들의 리스트를 생성하고 최솟값을 구하는 함수, 행렬을 회전 이후 행렬로 수정하는 함수를 각각 생성하여 활용한다.
- 초기 행렬을 생성하는 함수를 정의한다. def createMatrix(matrix)
- 한 행에 해당하는 리스트를 저장할 리스트를 생성한다. li = list()
- 숫자는 1부터 주어진 행과 열의 곱까지 들어가게 된다. for num in range(1, rows * columns + 1)
- 한 행에 해당하는 리스트에 숫자를 추가한다. li.append(num)
- 만약 숫자가 열 범위로 나누었을 때 0이면(한 행의 마지막 숫자이면) if (num % columns == 0)
- 해당 행을 행렬에 추가하고 matrix.append(li)
- 행의 숫자 리스트를 다시 빈 리스트로 초기화한다. li = list()
- 회전을 수행하는 숫자들 중 최솟값을 찾는 함수를 정의한다. def findMin(q)
- 회전을 수행하는 숫자들을 넣을 리스트를 생성한다. li = list()
- 초기 x좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. x = q[0] - 1
- 초기 y좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. y = q[1] - 1
- 회전을 수행하는 시작 위치의 숫자를 리스트에 넣는다. li.append(matrix[x][y])
- 이어서 회전을 수행하는 테두리의 위쪽 가로 행의 숫자를 차례대로 리스트에 추가한다. for i in range(q[3] - q[1]): li.append(matrix[x][y + i + 1])
- y좌표의 위치를 가로 행의 제일 오른쪽으로 이동한다. y = q[3] - 1
- 이어서 회전을 수행하는 테두리의 오른쪽 세로 열의 숫자를 차례대로 리스트에 추가한다. for i in range(q[2] - q[0]): li.append(matrix[x + i + 1][y])
- x좌표의 위치를 세로 열의 제일 아래쪽으로 이동한다. x = q[2] - 1
- 이어서 회전을 수행하는 테두리의 아래쪽 가로 행의 숫자를 차례대로 리스트에 추가한다. for i in range(q[3] - q[1]): li.append(matrix[x][y - i - 1])
- y좌표의 위치를 가로 행의 제일 왼쪽으로 이동한다. y = q[1] - 1
- 이어서 회전을 수행하는 테두리의 왼쪽 열의 숫자를 차례대로 리스트에 추가한다. for i in range(q[2] - q[0]): li.append(matrix[x - i - 1][y])
- 시작하는 위치의 숫자가 마지막에 중복으로 들어가므로 마지막 숫자를 제거한다. li.pop()
- 시계방향으로 숫자를 회전하여 다시 행렬을 수정해야 하므로 회전하는 숫자들을 오른쪽으로 한 칸씩 이동한다. 이동은 제일 뒤 숫자를 제일 앞으로 이동시키면 된다. li.insert(0, li.pop())
- 회전하는 숫자의 리스트에 있는 숫자들 중 최솟값을 정답 리스트에 추가한다. answer.append(min(li))
- 회전하는 숫자의 리스트를 반환한다. return li
- 회전 이후 행렬의 결과를 수정할 함수를 생성한다. def reMatrix(q, li)
- 초기 x좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. x = q[0] - 1
- 초기 y좌표의 위치를 행렬의 인덱스 값으로 수정하여 저장한다. y = q[1] - 1
- 회전하는 숫자 리스트에서 숫자를 가져올 인덱스 번호를 지정할 변수를 생성한다. idx = 0
- 회전하는 테두리의 시작 위치에 회전하는 숫자의 리스트의 첫 번째 값을 넣어 수정한다. matrix[x][y] = li[idx]
- 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
- 이어서 회전을 수행하는 테두리의 위쪽 가로 행의 숫자를 차례대로 수정한다. for i in range(q[3] - q[1]): matrix[x][y + i + 1] = li[idx]
- 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
- y좌표의 위치를 가로 행의 제일 오른쪽으로 이동한다. y = q[3] - 1
- 이어서 회전을 수행하는 테두리의 오른쪽 세로 열의 숫자를 차례대로 수정한다. for i in range(q[2] - q[0]): matrix[x + i + 1][y] = li[idx]
- 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
- x좌표의 위치를 세로 열의 제일 아래쪽으로 이동한다. x = q[2] - 1
- 이어서 회전을 수행하는 테두리의 아래쪽 가로 행의 숫자를 차례대로 수정한다. for i in range(q[3] - q[1]): matrix[x][y - i - 1] = li[idx]
- 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
- y좌표의 위치를 가로 행의 제일 왼쪽으로 이동한다. y = q[1] - 1
- 이어서 회전을 수행하는 테두리의 왼쪽 열의 숫자를 차례대로 수정한다. for i in range(q[2] - q[0] - 1): matrix[x - i - 1][y] = li[idx]
- 수정할 때마다 회전하는 숫자 리스트의 인덱스 번호를 1 증가시킨다. idx += 1
- 초기 행렬을 저장할 리스트를 생성한다. matrix = []
- 초기 행렬을 생성하는 함수로 초기 행렬을 생성한다. createMatrix(matrix)
- 회전 목록에서 목록을 하나씩 불러오며 for q in queries
- 회전 목록을 기반으로 회전하는 숫자의 최솟값을 구하고 회전하는 숫자 리스트를 반환한다. li = findMin(q)
- 회전 목록과 구한 회전하는 숫자 리스트를 기반으로 행렬을 회전 이후 행렬로 수정한다. reMatrix(q, li)
3. 소스코드
def solution(rows, columns, queries):
answer = []
def createMatrix(matrix):
li = list()
for num in range(1, rows * columns + 1):
li.append(num)
if (num % columns == 0):
matrix.append(li)
li = list()
def findMin(q):
li = list()
x = q[0] - 1
y = q[1] - 1
li.append(matrix[x][y])
for i in range(q[3] - q[1]):
li.append(matrix[x][y + i + 1])
y = q[3] - 1
for i in range(q[2] - q[0]):
li.append(matrix[x + i + 1][y])
x = q[2] - 1
for i in range(q[3] - q[1]):
li.append(matrix[x][y - i - 1])
y = q[1] - 1
for i in range(q[2] - q[0]):
li.append(matrix[x - i - 1][y])
li.pop()
li.insert(0, li.pop())
answer.append(min(li))
return li
def reMatrix(q, li):
x = q[0] - 1
y = q[1] - 1
idx = 0
matrix[x][y] = li[idx]
idx += 1
for i in range(q[3] - q[1]):
matrix[x][y + i + 1] = li[idx]
idx += 1
y = q[3] - 1
for i in range(q[2] - q[0]):
matrix[x + i + 1][y] = li[idx]
idx += 1
x = q[2] - 1
for i in range(q[3] - q[1]):
matrix[x][y - i - 1] = li[idx]
idx += 1
y = q[1] - 1
for i in range(q[2] - q[0] - 1):
matrix[x - i - 1][y] = li[idx]
idx += 1
matrix = []
createMatrix(matrix)
for q in queries:
li = findMin(q)
reMatrix(q, li)
return answer
728x90
반응형
'프로그래머스 > Python' 카테고리의 다른 글
[프로그래머스] 테이블 해시 함수 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.07.01 |
---|---|
[프로그래머스] 거리두기 확인하기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.06.26 |
[프로그래머스] 여행경로 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.06.15 |
[프로그래머스] 미로 탈출 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.05.26 |
[프로그래머스] 수식 최대화 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.05.11 |
[프로그래머스] 괄호 변환 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.05.05 |
[프로그래머스] 가장 먼 노드 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.05.04 |
[프로그래머스] 섬 연결하기 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트 (0) | 2024.04.28 |