[python] 행렬 테두리 회전하기

JunHyeok Oh·2021년 6월 27일
0

문제

문제 설명

  • rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 테두리 부분에 있는 숫자들을 시계방향으로 회전시키려 합니다. 각 회전은 (x1, y1, x2, y2)인 정수 4개로 표현하며, 그 의미는 다음과 같습니다.

  • x1 행 y1 열부터 x2 행 y2 열까지의 영역에 해당하는 직사각형에서 테두리에 있는 숫자들을 한 칸씩 시계방향으로 회전합니다.

  • 행렬의 세로 길이(행 개수) rows, 가로 길이(열 개수) columns, 그리고 회전들의 목록 queries가 주어질 때, 각 회전들을 배열에 적용한 뒤, 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담아 return 하도록 solution 함수를 완성해주세요.

예시

  • rows = 5 , columns = 4, queries = [[2,1,3,2],[3,3,4,4]] 일 경우 queries에 해당하는 범위만큼의 사각형 테두리에서 시계방향으로의 회전이 이루어진다.
  • 그 회전은 기억되어 저장되며 그 사각형 테두리의 최소값의 리스트를 answer로 return하면 된다.

풀이

나의 풀이

def solution(rows, columns, queries):
    count = 1
    target=[]
    # 열과 행에 맞는 사각형 만들기 ( target 리스트 )
    for i in range(rows):
        matrix = []
        for j in range(columns):
            matrix.append(count)
            count +=1
        target.append(matrix)
        
    answer = []
    for k in queries:
        clock=[]
        row = []
        col = []
        # 시계방향으로 움직일 행렬상의 지점 구하기
        row += [ k[0] ] * (k[3]-k[1] + 1)
        row += [rc for rc in range(k[0]+1,k[2])]
        row += [ k[2] ] * (k[3]-k[1] + 1 )
        row += [rc for rc in range(k[2]-1,k[0],-1)]

        col += [k[1]]
        col += [cc for cc in range(k[1]+1,k[3])]
        col += [k[3]] * (k[2]-k[0]+1)
        col += [cc for cc in range(k[3]-1,k[1],-1)]
        col += [k[1]] * (k[2]-k[0])
        
        
        loc = [[a,b] for a,b in zip(row,col)]
        for i in loc:
            clock.append(target[i[0]-1][i[1]-1])
        # 시계방향 회전에 해당할 좌표 배정 
        clock.insert(0,clock[-1])
        clock.pop()
        answer.append(min(clock))
        
        # 다시 사각형 테두리에 해당하는 값 집어넣기
        for index, num in enumerate(loc):
            target[num[0]-1][num[1]-1] = clock[index]
        
    return answer
  • 나의 풀이의 핵심 아이디어는 queries 에 해당하는 사각형의 테두리의 행렬상의 좌표를 시계방향으로 구해서 리스트에 넣는 것이다. 즉 좌측상단을 (0,0)으로 하는 좌표계에서 시계방향으로 회전할 사각형의 테두리의 모든 좌표를 loc이라는 리스트에 넣는 방법이다.
  • row에는 행의 좌표를, columns 에는 열의 좌표를 넣고 zip함수를 이용해 loc 리스트에 좌표 형태의 리스트로 삽입했다.
  • 그 후 loc을 for문 안에 넣고 해당하는 값, 즉 해당 좌표에 존재하는 숫자를 clock이라는 리스트에 넣었다. clock의 마지막 원소를 처음에 넣고 (시계방향으로 회전 효과), 다시 for문을 통해 clock의 값들을 loc에 해당하는 좌표에 맞게 target 리스트를 변화시켰다.

testcase

테스트 케이스(rows, columns, queries)
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]
100,97,[[1,1,100,97]][1]
profile
Univ of Seoul , Statistics

0개의 댓글

관련 채용 정보