알고리즘 풀이/프로그래머스

[Level 2] 행렬 테두리 회전하기

mhko411 2021. 9. 9. 17:36
728x90

https://programmers.co.kr/learn/courses/30/lessons/77485

 

코딩테스트 연습 - 행렬 테두리 회전하기

6 6 [[2,2,5,4],[3,3,6,6],[5,1,6,3]] [8, 10, 25] 3 3 [[1,1,2,2],[1,2,2,3],[2,1,3,2],[2,2,3,3]] [1, 1, 5, 3]

programmers.co.kr


접근

총 4방향으로 회전하기 때문에 각 방향에 대해 회전해야 하는 범위를 정하여 새로운 2차원 배열에 저장한다. 이후에 새로운 2차원 배열의 좌표에 아무 숫자도 들어있지 않았다면 기존의 숫자를 대입한다.

 

구현

- 아래는 좌표를 입력받아 테두리를 회전시키는 함수이다.

- 각각의 4방향으로 나누고 범위를 지정하여 새로운 2차원 배열인 new_board에 저장하였다.

- 이때 위치가 바뀌는 숫자들에 대해 최솟값 비교를 진행한다.

- 4방향이 모두 new_board에 채워졌다면 new_board를 탐색하여 0인 곳은 board에 있는 숫자를 대입한다.

- 최종적으로 new_board와 최솟값을 반환한다.

def rotate(y1, x1, y2, x2, r, c, board):
    new_board = [[0 for _ in range(c)] for _ in range(r)]
    min_value = 987654321
    for x in range(x1, x2):
        new_board[y1][x+1] = board[y1][x]
        min_value = min(min_value, new_board[y1][x+1])
    
    for y in range(y1, y2):
        new_board[y+1][x2] = board[y][x2]
        min_value = min(min_value, new_board[y+1][x2])
    
    for x in range(x2, x1, -1):
        new_board[y2][x-1] = board[y2][x]
        min_value = min(min_value, new_board[y2][x-1])
    
    for y in range(y2, y1, -1):
        new_board[y-1][x1] = board[y][x1]
        min_value = min(min_value, new_board[y-1][x1])
    
    for y in range(r):
        for x in range(c):
            if new_board[y][x] == 0:
                new_board[y][x] = board[y][x]
    
    return new_board, min_value

전체 코드

def rotate(y1, x1, y2, x2, r, c, board):
    new_board = [[0 for _ in range(c)] for _ in range(r)]
    min_value = 987654321
    for x in range(x1, x2):
        new_board[y1][x+1] = board[y1][x]
        min_value = min(min_value, new_board[y1][x+1])
    
    for y in range(y1, y2):
        new_board[y+1][x2] = board[y][x2]
        min_value = min(min_value, new_board[y+1][x2])
    
    for x in range(x2, x1, -1):
        new_board[y2][x-1] = board[y2][x]
        min_value = min(min_value, new_board[y2][x-1])
    
    for y in range(y2, y1, -1):
        new_board[y-1][x1] = board[y][x1]
        min_value = min(min_value, new_board[y-1][x1])
    
    for y in range(r):
        for x in range(c):
            if new_board[y][x] == 0:
                new_board[y][x] = board[y][x]
    
    return new_board, min_value

def solution(rows, columns, queries):
    answer = []
    board = [[y+1 + (columns * x) for y in range(columns)] for x in range(rows)]
    
    for y1, x1, y2, x2 in queries:
        y1 -= 1
        x1 -= 1
        y2 -= 1
        x2 -= 1
        board, value = rotate(y1, x1, y2, x2, rows, columns, board)
        answer.append(value)
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 3] 불량 사용자  (0) 2021.09.10
[Level 3] 이중우선순위큐  (0) 2021.09.09
[Level 3] 보석 쇼핑  (0) 2021.09.08
[Level 3] 징검다리 건너기  (0) 2021.09.07
[Level 3] 기지국 설치  (0) 2021.09.06