algorithm/프로그래머스 문제

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

장경훈 2022. 7. 18. 16:28
  [LV2] 행렬 테두리 회전하기 문제링크
rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, 
www.programmers.co.kr

 

문제해설

 

이 문제는 단순하게 문제에서 요구하는 배열 회전을 통해서 풀면 되는 문제이며 침착하게 다음 단계를 이용하면 어렵지 않게 문제를 해결할 수 있다.

  1. 왼쪽테두리에 가장 위에 있는 숫자를 따로 저장한 후 나머지 숫자를 밑에서 부터 한칸씩 올리고 이 숫자들을 비교하여 작은 숫자를 저장한다.
  2. 아래테두리에 숫자들을 오른쪽에서 왼쪽으로 이동시키며 1단계와 같이 지금까지 중 제일 작은 숫자를 저장한다
  3. 오른쪽 테두리를 위에서 아래로 이동시키고 작은 숫자를 저장한다
  4. 위쪽 테두리를 왼쪽에서 오른쪽으로 이동시키고 작은 숫자를 비교한다.
  5. 1단계에서 저장해놓은 숫자를 범위 기준 (1,2)에 저장함으로써 회전을 마친다 

코드는 다음과 같다.

def solution(rows, columns, queries):
    answer = []
    cnt=1 #기본적인 숫자행렬을 만들기 위한 변수
    image=[[0]*columns for _ in range(rows)] #숫자 행렬을 정리하기 위한 리스트
    for i in range(rows): #숫자를 1부터 집어 넣는다
        for j in range(columns):
            image[i][j]=cnt
            cnt+=1
    for RS,CS,RE,CE in queries:#RS=row시작부분, CS=column 시작부분, RE= row 마지막부분, CE= columns 마지막 부분
    
        tmp=image[RS-1][CS-1] # 1단계에서 언급한 가장 위에 숫자 저장
        minnum=1e9 #가장작은 숫자를 저장하기 위해 10^9로 변수 초기화
        minnum=min(tmp,minnum)# 우선 뽑아논 숫자를 가장 작은 값으로 설정
        for i in range(RS-1,RE-1): #1단계 실행
            image[i][CS-1]=image[i+1][CS-1]
            minnum=min(minnum,image[i][CS-1])
        for i in range(CS-1,CE-1):#2단계 실행
            image[RE-1][i]=image[RE-1][i+1]
            minnum=min(minnum,image[RE-1][i+1])
        for i in range(RE-1,RS-1,-1):#3단계 실행
            image[i][CE-1]=image[i-1][CE-1]
            minnum=min(minnum, image[i][CE-1])
        for i in range(CE-1,CS-1,-1):#4단계 실행
            image[RS-1][i]=image[RS-1][i-1]
            minnum=min(minnum, image[RS-1][i])
        image[RS-1][CS]=tmp #5단계 실행 
        answer.append(minnum)
    return answer