2021 Dev-Matching: 웹 백엔드 개발자(상반기) : 행렬 테두리 회전하기 - python3 풀이

Minhee kang·2021년 6월 15일
0

문제 보러 가기👈 클릭!

💡 풀이

문제 파악

  • 숫자가 순서대로 적힌 행렬이 있음. 직사각형 모양의 범위 [x1, y1, x2, y2]가 여러개 담겨져 있는 queries을 입력받음. queries의 원소 순서대로 행렬 위에서 직사각형을 잡고, 테두리에 존재하는 숫자들만 시계방향으로 이동. 그 중 제일 작은 값을 return.

  • 첫번째 이동을 하고, 그 상태에서 변경없이 두번째 이동...그 상태에서 n번째 이동을 하고 이동했던 모든 숫자들 중 가장 작은 값을 return 함에 주의

풀이 방법

  • 위치를 키 값으로 갖고 해당 위치에 존재하는 숫자를 값으로 갖는 딕셔너리 자료형 board를 선언
ex) board[(1,1)] = 1 , board[(1,2)] = 2 .. ,board[(rows, colunms)] = rows*colunms
  • 시작 위치 start = (i, j)를 왼쪽 위 모서리로 정함. 오른쪽,아래,왼쪽,위 방향으로 순서대로 직사각형을 그리며 한 칸씩 숫자 이동

    오른쪽 : i는 그대로. j는 1씩 증가
    아래 : j는 그래도. i는 1씩 증가
    왼쪽 : i는 그대로. j는 1씩 감소
    위 : j는 그대로. i는 1씩 감소

    다음과 시작 위치에 있는 값과 이동한 위치에 있는 값을 교환하며 계속하여 한 칸씩 이동. 교환할때마다 min함수를 사용하여 최솟값을 갱신.

💡 전체 소스 코드

def solution(rows, columns, queries):
    answer = []
    
    board, num = dict(), 1
    for i in range(rows):   #board[(위치)] = 위치에 있는 숫자
        for j in range(columns):
            board[(i+1, j+1)] = num
            num += 1
            
    for x1, y1, x2, y2 in queries:
        start = (i, j) = (x1, y1) #첫 시작 위치
        min_num = board[start]  #최솟값 
        for n in [1, -1]:
            for cnt in range(y2-y1):
                j += n
                board[start], board[i, j] = board[i, j],  board[start]
                min_num = min(min_num, board[start])
            for cnt in range(x2-x1):
                i += n
                board[start], board[i, j] = board[i, j], board[start]
                min_num = min(min_num, board[start])
        answer.append(min_num)
    
    return answer

0개의 댓글

관련 채용 정보