문제
요약
- n*n 크기의 정방행렬이 주어진다.
- 왼쪽 위 꼭짓점과 오른쪽 아래 꼭짓점이 주어지면, 해당 사각형의 테두리를 회전시키자.
- 회전시켜서 위치가 변한 숫자들 중 가장 작은 숫자를 순서대로 배열에 담아 반환.
분류
- 배열
풀이
1. 내 풀이
- 발상 : 최대한 직관적으로 생각했다. 굳이 분류하자면 시뮬레이션 정도. 문제에서 요구하는 것들을 실제로 실행하고 원하는 값을 구한다.
- 마지막에 배열을 더해서 min() 연산하는 부분은 기억해두자. 다른 상황에서도 요긴하게 쓸 수 있을 듯. (현재 풀이에서 최선은 아니다. 추가 비용 들어감.)
import sys
def solution(rows, columns, queries):
arr = [[(i) * columns + (j + 1) for j in range(columns)] for i in range(rows)]
ans = []
for y1, x1, y2, x2 in queries:
min_num = sys.maxsize;
y1 -= 1; x1 -= 1; y2 -= 1; x2 -= 1
temp_x1y2 = arr[y2][x1]
temp_x2y1 = arr[y1][x2]
for i in range(x2, x1, -1):
arr[y1][i] = arr[y1][i - 1]
for j in range(x1, x2):
arr[y2][j] = arr[y2][j + 1]
for k in range(y1, y2 - 1):
arr[k][x1] = arr[k + 1][x1]
for l in range(y2, y1, -1):
arr[l][x2] = arr[l - 1][x2]
arr[y2 - 1][x1] = temp_x1y2
arr[y1 + 1][x2] = temp_x2y1
min_num = min(arr[y1][x1 : x2 + 1] + arr[y2][x1 : x2 + 1] + [arr[var][x1] for var in range(y1 + 1, y2)] + [arr[var][x2] for var in range(y1 + 1, y2)])
ans.append(min_num)
return ans
2. 최적화 풀이
- <취업과 이직을 위한 프로그래머스 코딩테스트 문제 풀이 전략> 을 참고한 코드입니다. (링크)
- 발상 : 리스트 슬라이싱을 이용한 for문 최적화.
def solution(rows, columns, queries):
answer = []
board = [[columns * j + (i+1) for i in range(columns)] for j in range(rows)]
for query in queries:
a, b, c, d = query[0]-1, query[1]-1, query[2]-1, query[3]-1
row1, row2 = board[a][b:d], board[c][b+1:d+1]
_min = min(row1 + row2)
for i in range(c, a, -1):
board[i][d] = board[i-1][d]
if board[i][d] < _min: _min = board[i][d]
for i in range(a, c):
board[i][b] = board[i+1][b]
if board[i][b] < _min: _min = board[i][b]
board[a][b+1:d+1], board[c][b:d] = row1, row2
answer.append(_min)
return answer