다른사람 풀이
answer = []
array = [[0 for col in range(columns)] for row in range(rows)]
t = 1
for row in range(rows):
for col in range(columns):
array[row][col] = t
t += 1
먼저 행렬을 만들어줘야한다. 처음에는 값이 0으로 초기화된 rows*columns 크기의 배열을 만들어준다. 그 후, 가로방향으로 숫자가 1씩 증가하면서 적혀있는 형태이기 때문에 행과 열을 이동하면서 값을 할당해준다.
for x1,y1,x2,y2 in queries:
tmp = array[x1-1][y1-1]
mini = tmp
for k in range(x1-1,x2-1): #왼쪽 세로
test = array[k+1][y1-1]
array[k][y1-1] = test
mini = min(mini, test)
이제 주어진 queries를 보며 for문을 진행한다. quereis의 각 행은 4개의 정수 [x1, y1, x2, y2]로 이뤄져 있기 때문에 값의 이름을 문제와 똑같이 정해주었다. 먼저 왼쪽 세로부터 시작을 해준다. 하나의 값을 다른 하나의 값으로 옮기는 과정을 반복해야한다.
그림으로 확인을 해보면 이 부분의 이동이 이뤄지는 것이다. y 값은 y1-1 로 고정을 시켜주고 x값을 하나씩 증가시켜주며 진행한다. 이때 이동한 숫자 중 최솟값을 저장해야하기 때문에 min() 함수를 이용해 더 작은 값을 저장해둔다. 여기서 tmp를 왜 array[x1-1][y1-1]로 잡았는가는 array[x1-1][y1-1]값은 array[x-1][y1]로 이동을 해줘야 하는 값인데 이 for문에서는 왼쪽 세로 부분이기 때문에 상단 가로 for문이 돌아갈 때 옮겨질 예정인 값이다. 하지만 현재 값을 옮기면서 array[x-1][y-1]값이 다른 값으로 대체되기 때문에 그 값을 저장해서 마지막에 넣어주기 위해 가지고 있는 것이다. 이렇게 왼쪽 세로의 회전이 완성되었다.
for k in range(y1-1,y2-1): # 하단 가로
test = array[x2-1][k+1]
array[x2-1][k] = test
mini = min(mini, test)
for k in range(x2-1,x1-1,-1): # 오른쪽 세로
test = array[k-1][y2-1]
array[k][y2-1] = test
mini = min(mini, test)
for k in range(y2-1,y1-1,-1): # 상단 가로
test = array[x1-1][k-1]
array[x1-1][k] = test
mini = min(mini, test)
이어서 왼쪽 세로 -> 하단 가로 -> 오른쪽 세로 -> 상단 가로 순으로 회전을 진행해준다. 이렇게 모든 회전이 완료된다면 이 상태가 될 것이다.
두 번째 코드 블록에서 설명했던 것처럼 array[x1-1][y1-1]값에는 값이 바뀌기 전의 array[x-1][y1]의 값이 입력이 돼야 하는데, 이 값이 초반에 다른 값으로 대체가 되었기 때문에 바뀐 이후의 값이 들어가게 된다.
array[x1-1][y1] = tmp
answer.append(mini)
그렇기 때문에 처음에 tmp에 저장한 값을 다시 array[x1-1][y1-1] 에 넣어주는 과정이 마지막에 들어가야 한다. 그 이후 회전한 값 중 제일 최솟값을 정답 배열에 추가해주면 한 회전이 끝난다!
5. 전체 코드
def solution(rows, columns, queries):
answer = []
array = [[0 for col in range(columns)] for row in range(rows)]
t = 1
for row in range(rows):
for col in range(columns):
array[row][col] = t
t += 1
for x1,y1,x2,y2 in queries:
tmp = array[x1-1][y1-1]
mini = tmp
for k in range(x1-1,x2-1):
test = array[k+1][y1-1]
array[k][y1-1] = test
mini = min(mini, test)
for k in range(y1-1,y2-1):
test = array[x2-1][k+1]
array[x2-1][k] = test
mini = min(mini, test)
for k in range(x2-1,x1-1,-1):
test = array[k-1][y2-1]
array[k][y2-1] = test
mini = min(mini, test)
for k in range(y2-1,y1-1,-1):
test = array[x1-1][k-1]
array[x1-1][k] = test
mini = min(mini, test)
array[x1-1][y1] = tmp
answer.append(mini)
return answer
'Engineering WIKI > Programmers' 카테고리의 다른 글
[프로그래머스] 최솟값 만들기 (0) | 2022.05.17 |
---|---|
[프로그래머스] 최댓값과 최솟값 (0) | 2022.05.17 |
[프로그래머스] 카펫 (0) | 2022.05.17 |
[프로그래머스] H-Index (정렬) (0) | 2022.05.13 |
[프로그래머스] 타겟넘버 (0) | 2022.05.06 |
[프로그래머스] 124 나라의 숫자 (0) | 2022.05.04 |
[프로그래머스] 오픈채팅방 (0) | 2022.05.02 |
[프로그래머스] 문자열 압축 (0) | 2022.05.02 |