-
[프로그래머스] 행렬 테두리 회전하기Engineering WIKI/Programmers 2022. 5. 10. 23:26
코딩테스트 연습 - 행렬 테두리 회전하기
6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]
programmers.co.kr
다른사람 풀이
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