[LV2] 행렬 테두리 회전하기 문제링크 rows x columns 크기인 행렬이 있습니다. 행렬에는 1부터 rows x columns까지의 숫자가 한 줄씩 순서대로 적혀있습니다. 이 행렬에서 직사각형 모양의 범위를 여러 번 선택해, www.programmers.co.kr |
문제해설
이 문제는 단순하게 문제에서 요구하는 배열 회전을 통해서 풀면 되는 문제이며 침착하게 다음 단계를 이용하면 어렵지 않게 문제를 해결할 수 있다.
- 왼쪽테두리에 가장 위에 있는 숫자를 따로 저장한 후 나머지 숫자를 밑에서 부터 한칸씩 올리고 이 숫자들을 비교하여 작은 숫자를 저장한다.
- 아래테두리에 숫자들을 오른쪽에서 왼쪽으로 이동시키며 1단계와 같이 지금까지 중 제일 작은 숫자를 저장한다
- 오른쪽 테두리를 위에서 아래로 이동시키고 작은 숫자를 저장한다
- 위쪽 테두리를 왼쪽에서 오른쪽으로 이동시키고 작은 숫자를 비교한다.
- 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
'algorithm > 프로그래머스 문제' 카테고리의 다른 글
[프로그래머스 LV2]프린터 (0) | 2022.07.28 |
---|---|
[프로그래머스 LV2] 뉴스 클러스터링 (0) | 2022.07.19 |
[프로그래머스LV2]메뉴 리뉴얼 (0) | 2022.07.15 |
[프로그래머스 LV2] 소수 찾기 (0) | 2022.07.15 |
[프로그래머스 LV2] 카펫 (0) | 2022.07.14 |