새소식

Computer Science/코딩테스트 문제 풀이

[프로그래머스] 행렬 테두리 회전하기

  • -

문제 보러 가기 : 프로그래머스 행렬 테두리 회전하기

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

rows와 columns가 주어지고 이에 맞는 board를 만들고 

queries는 회전해야할 범위가 주어짐 

queries가 [[2,2,5,4], [3,3,6,6], [5,1,6,3]]이면 

(2,2)에서 (5,4) 범위의 테두리에서 가장 작은 값을 저장해 두고 시계방향으로 회전함 

다음 (3,3)에서 (6,6) 범위의 테두리에서 가장 작은 값을 저장해 두고 시계방향으로 회전함

다음 (5,1)에서 (6,3) 범위의 테두리에서 가장 작은 값을 저장하고 시계방향으로 회전함 

 

위 진행을 그림으로 나타내면 아래와 같음 

 

1단계 board를 만든다.

2단계 테두리부분을 하나의 1차원 행렬로 만든다 

3단계 그 1차원 행렬에서 가장 작은 값을 저장

4단계 1차원 행렬을 시계 방향으로 회전하여 board를 업데이트 한다.

 


from collections import deque 

def rotation(arr):
    k=1
    arr=deque(arr)
    arr.rotate(-k)
    return list(arr)
    
    
def solution(rows, columns, queries):
    # 1단계 전처리 
    queries = [[r1-1, c1-1, r2-1, c2-1] for r1,c1,r2,c2 in queries]
    board = [[i*columns+j for j in range(1,columns+1)] for i in range(rows)]
    answer = []
    # 2단계 회전에 참여하는 숫자들을 하나의 1차원 배열에 넣는다.
    for x1,y1,x2,y2 in queries:
        indices=[]
        # 가장 위 테두리 
        indices += [(x1,c) for c in range(y1,y2+1)]
        # 가장 오른쪽 테두리 
        indices += [(r,y2) for r in range(x1+1,x2)]
        # 가장 아래 테두리 
        indices += [(x2, c) for c in range(y2,y1-1, -1)]
        # 가장 왼쪽 테두리 
        indices += [(r, y1) for r in range(x2-1,x1, -1)]
        
        nums = [board[r][c] for r,c in indices]
        
        # 3단계 배열 중에 가장 작은 수 저장 
        answer.append(min(nums))
        
        # 4단계 한칸씩 시계 방향으로 회전 하고 board를 업데이트 
        # indices = indices[1:] + [indices[0]]
        indices = rotation(indices)
        for num, (r,c) in zip(nums, indices):
            board[r][c] = num
    
    return answer
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.