알고리즘

[프로그래머스/LV2] 행렬 테두리 회전하기(구현)

motti 2024. 1. 17. 15:00
반응형

문제링크 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

풀이

from collections import deque

def solution(rows, columns, queries):
    answer = []
    # 회전이 주어질때 바뀌는 위치의 범위
    # 바꾸는 방법 : 이전 값을 다음값으로 옮기는 방법 rotate?
    # 범위에 있던 숫자중 가장 작은 수
    # 회전할 필요 없음 -> 각 위치가 있을때, 거기서 테두리를 뽑아내는 것과 거기서 제일 작은 값만 추출
    
    # (2,2,5,4) 라면 
    # (x1,y1),(x1,y2),(x2,y1),(x2,y2)
    # (x1,y1 ~ y2) , (x2 , y1 ~ y2)
    # (x1 ~ x2 ,y1) , (x1 ~ x2 , y2)
    
    # (x1, y1 ~ y2) , (x1~ x2, y2) , (x2 , y2 ~ y1), (x2 ~ x1 , y1)
    
    # ()
    # 세로는 7을 더하고 빼고 (columns + 1 ) 가로는 5를 더하고 빼고 (rows - 1)
    board = []
    cnt = 1
    for i in range(1,rows+1):
        lst = []
        for j in range(1,columns+1):
            lst.append(cnt)
            cnt +=1
        board.append(lst)
        
    
    for x1,y1,x2,y2 in queries:
        idx = deque()
        num = deque()
        for y in range(y1,y2+1):
            idx.append((x1-1,y-1))
            num.append(board[x1-1][y-1])
            
        for x in range(x1+1,x2+1):
            idx.append((x-1,y2-1))
            num.append(board[x-1][y2-1])
            
        for y in range(y2-1,y1-1,-1):
            idx.append((x2-1,y-1))
            num.append(board[x2-1][y-1])
            
        for x in range(x2-1,x1,-1):
            idx.append((x-1,y1-1))
            num.append(board[x-1][y1-1])
        
        num.rotate(1)
  
        answer.append(min(num))
        for dx,nu in zip(idx,num):
            res = 10e19
            x = dx[0]
            y = dx[1]
            
            board[x][y] = nu

    return answer


1. 꼭짓점이 주어질때, 바뀌게 되는 테두리를 찾고 이를 리스트에 저장한다. 추가로, 해당위치의 값도 저장
2. 큐를 이용하여 rotate를 적용하면 한칸씩 밀려쓰기가 가능하다. 이를 저장된 위치에 다시 삽입한다.
3. (느낀점) 초반에 테두리를 찾자마자 이전위치의 값을 옆을 옮기는 식으로 할랬는데, 옮겨지면서 값이 바뀌게 되고 그값이 다시 옮겨지는 불상사가 발생하게 된다. 순서대로 옮기는 경우에서는 위치를 저장하고 값을 넣어주는 방법이 나을 것 같다.

반응형