[Programmers][Level2][Python]행렬테두리회전하기

냥린이·2022년 1월 11일
0

알고리즘

목록 보기
15/28
post-thumbnail

문제

rows x columns 크기의 행렬에 1부터 rows x columns 까지 정수가 오름차순으로 저장되어 있다.

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

매 회전마다 회전하는 정수 중 가장 작은 수를 배열에 담아 반환한다.

풀이

Trial 1st 풀이

def solution(rows, columns, queries):
    answer = []
    
    # 2차원 배열 생성 및 초기화
    arr = [[j+1 for j in range(columns*i, columns*(i+1))] for i in range(rows)]
    
    # 값 회전
    for x1, y1, x2, y2 in queries:
        # 좌측 상단 원소 임시 저장
        tmp = arr[x1-1][y1-1]
        # 임시 저장한 값으로 최소값 변수 초기화
        min_ = tmp
        
        # 왼쪽열 (위로 이동)
        for i in range(x1-1, x2-1):
            # 최소값 갱신
            min_ = min(min_, arr[i+1][y1-1])
            # 아래열에서 위열로 원소 복사
            arr[i][y1-1] = arr[i+1][y1-1]
            
        # 아래행 (왼쪽으로 이동)
        for i in range(y1-1, y2-1):
            # 최소값 갱신
            min_ = min(min_, arr[x2-1][i+1])
            # 왼쪽에서 오른쪽으로 원소 복사
            arr[x2-1][i] = arr[x2-1][i+1]
            
        # 오른쪽열 (아래로 이동)
        for i in range(x2-1, x1-1, -1):
            # 최소값 갱신
            min_ = min(min_, arr[i-1][y2-1])
            # 왼쪽에서 오른쪽으로 원소 복사
            arr[i][y2-1] = arr[i-1][y2-1] 
            
        # 위행 (오른쪽으로 이동)
        for i in range(y1-1, y2-1):
            # 최소값 갱신
            min_ = min(min_, arr[x1-1][i+1])
            # 왼쪽에서 오른쪽으로 원소 복사
            arr[x1-1][i] = arr[x1-1][i+1]
            
            
        # 임시저장 했던 좌측 상단 원소 넣어주기
        arr[x1-1][y1] = tmp
        
        # 회전한 원소 중 최소값 배열에 넣어주기 
        answer.append(min_)
        
            
    return answer

코드 실행에서 제공하는 테스트 케이스는 전부 통과했는데 막상 제출하니 전부 실패로 떴다.

회전이 다 된 배열을 프린트해서 돌려보니 회전이 잘못 되고 있었다.

요행히도 잘못된 회전이 최소값 계산에 영향을 주기 전에 문제가 끝나서 통과로 떴던 것 같다.

다시 꼼꼼하게 회전하는 식을 고쳐주었다.

원인은 회전 마지막 단계인 위행에서 오른쪽으로 이동할 때 (가장 오른쪽 순서부터 하나 왼쪽 것을 가져와서 복사) 반복문을 역순으로 지정해주지 않아서였다.

고쳐서 완성한 최종코드는 다음과 같다.

def solution(rows, columns, queries):
    answer = []
    
    # 2차원 배열 생성 및 초기화
    arr = [[j+1 for j in range(columns*i, columns*(i+1))] for i in range(rows)]
    
    # 값 회전
    for x1, y1, x2, y2 in queries:
        # 좌측 상단 원소 임시 저장
        tmp = arr[x1-1][y1-1]
        # 임시 저장한 값으로 최소값 변수 초기화
        min_ = tmp
        
        # 왼쪽열 (위로 이동)
        for i in range(x1-1, x2-1):
            # 최소값 갱신
            min_ = min(min_, arr[i+1][y1-1])
            # 아래열에서 위열로 원소 복사
            arr[i][y1-1] = arr[i+1][y1-1]
            
        # 아래행 (왼쪽으로 이동)
        for i in range(y1-1, y2-1):
            # 최소값 갱신
            min_ = min(min_, arr[x2-1][i+1])
            # 왼쪽에서 오른쪽으로 원소 복사
            arr[x2-1][i] = arr[x2-1][i+1]
            
        # 오른쪽열 (아래로 이동)
        for i in range(x2-1, x1-1, -1):
            # 최소값 갱신
            min_ = min(min_, arr[i-1][y2-1])
            # 왼쪽에서 오른쪽으로 원소 복사
            arr[i][y2-1] = arr[i-1][y2-1] 
            
        # 위행 (오른쪽으로 이동)
        for i in range(y2-1, y1-1, -1):
            # 최소값 갱신
            min_ = min(min_, arr[x1-1][i-1])
            # 왼쪽에서 오른쪽으로 원소 복사
            arr[x1-1][i] = arr[x1-1][i-1]
            
            
        # 임시저장 했던 좌측 상단 원소 넣어주기
        arr[x1-1][y1] = tmp
        
        # 회전한 원소 중 최소값 배열에 넣어주기 
        answer.append(min_)
        
    print(arr)        
    return answer

profile
홀로서기 기록장

0개의 댓글