[프로그래머스 / Level 2] 행렬 테두리 회전하기(파이썬) 2021 Dev-matching: 웹-벡엔드

khyojun·2022년 7월 16일
0

코테연습

목록 보기
6/21
post-thumbnail

📌문제 설명

📌제한 사항

  • rows는 2 이상 100 이하인 자연수이다.
  • columns는 2 이상 100 이하인 자연수입니다.
  • 처음에 행렬에는 가로 방향으로 숫자가 1부터 하나씩 증가하면서 적혀있습니다.
    • 즉, 아무 회전도 하지 않았을 때, i행 j열에 있는 숫자는 ((i-1)*columns+j)입니다.
  • queries의 행의 개수(회전의 개수)는 1이상 10,000 이하입니다.
  • queries의 각 행은 4개의 정수 [x1,y1,x2,y2]입니다.
    • x1 행 y1 열부터 x2 행 y2 열까지 영역의 테두리를 시계방향으로 회전한다는 뜻입니다.
    • 1<= x1 < x2 <=rows, 1<= y1 <y2 <=columns입니다.
    • 모든 회전은 순서대로 이루어집니다.
    • 예를 들어, 두 번째 회전에 대한 답은 첫 번째 회전을 실행한 다음, 그 상태에서 두 번째 회전을 실행했을 때 이동한 숫자 중 최솟값을 구하면 됩니다.

📌 Solution
이번 문제는 로직은 그렇게 어렵진 않아도 구현해나가는데 코드가 길어진 부분이 있다.

def solution(rows, columns, queries):
    answer = []
    arr=[]
    cnt=1
    for i in range(rows):
        col=[]
        for j in range(columns):
            col.append(cnt)
            cnt+=1
        arr.append(col)
    
    for x1,y1,x2,y2 in queries:
        x_move=x2-x1
        y_move=y2-y1 
        start_x=x1-1
        start_y=y1-1
        end_x=x2-1
        end_y=y2-1
        now_x=start_x
        now_y=start_y
        tmp=arr[start_x][start_y]
            
        mini=30000
            
        for j in range(1, y_move+1): # 가로 첫 무빙
            now=tmp
            tmp=arr[now_x][now_y+j]
            arr[now_x][now_y+j]=now
            mini=min(now, mini)
            if (now_y+j)==end_y:
                now_y=now_y+j
                break
                    
        for j in range(1, x_move+1): # 세로 내려가기
            now=tmp
            tmp=arr[now_x+j][now_y]
            arr[now_x+j][now_y]=now          
            mini=min(now, mini)
            if now_x+j==end_x:  
                now_x=now_x+j
                break
                
                    
        for j in range(1, y_move+1): # 역가로 무빙
            now=tmp
            tmp=arr[now_x][now_y-j]
            arr[now_x][now_y-j]=now
            mini=min(now, mini)
            if (now_y-j)==start_y:
                now_y=now_y-j
                break   
            
        for j in range(1, x_move+1): # 세로 올라가기
            now=tmp
            tmp=arr[now_x-j][now_y]
            arr[now_x-j][now_y]=now
            mini=min(now, mini)
            if (now_x-j)==start_x:
                now_x=now_x-j
                break
                    
        answer.append(mini)
            
    return answer
  

각각의 for문 옆에 주석으로 헷갈리지 않게 어느 방향으로 이동중인지 표시를 해놓았다. 이번 문제를 풀다가 중간에 list out of range가 떠서 왜 이러지 이러고 있다가 row와 column을 헷갈려서 계속 이렇게 오류가 뜨는것을 확인한 후 너무 허탈했다.

이번 문제에서는 구현하는데 시키는대로만 그대로 따라가면 해결할 수 있는 문제였다. 포기하지말고 해보는것이 좋을 것 같다.

문제 해결하며 알게 된 점

  1. row: 행 column : 열
profile
코드를 씹고 뜯고 맛보고 즐기는 것을 지향하는 개발자가 되고 싶습니다

0개의 댓글