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


내 풀이

 

def solution(rows,columns,queries):
    arr = [[(i)*columns+(j+1) for j in range(columns)] for i in range(rows)] //초기화
    answer=[]
    for x,y,x1,y1 in queries:
        tmp = arr[x-1][y-1] //0부터 시작하기때문에 x-1 y-1로 처리해줘야 한다.
        mini = tmp //최초 시작시에 처음 시작점이 최소값이기에 최초의 최소값을 처음 시작점으로 줬다.

        for i in range(x-1,x1-1):
            arr[i][y-1]=arr[i+1][y-1]       
            mini = min(arr[i][y-1],mini)
        for i in range(y-1,y1-1):
            arr[x1-1][i]=arr[x1-1][i+1]
            mini = min(arr[x1-1][i],mini)
        for i in range(x1-1,x-1,-1):
            arr[i][y1-1] = arr[i-1][y1-1]
            mini = min(arr[i][y1-1],mini)
        for i in range(y1-1,y-1,-1):
            arr[x-1][i] = arr[x-1][i-1]
            mini = min(arr[x-1][i],mini)

        arr[x-1][y]=tmp
        answer.append(mini)
    return answer

 

 


다른사람의 풀이

def solution(rows, columns, queries):
    answer = []

    board = [[i+(j)*columns for i in range(1,columns+1)] for j in range(rows)]
    # print(board)

    for a,b,c,d in queries:
        stack = []
        r1, c1, r2, c2 = a-1, b-1, c-1, d-1


        for i in range(c1, c2+1):

            stack.append(board[r1][i])
            if len(stack) == 1:
                continue
            else:
                board[r1][i] = stack[-2]


        for j in range(r1+1, r2+1):
            stack.append(board[j][i])
            board[j][i] = stack[-2]

        for k in range(c2-1, c1-1, -1):
            stack.append(board[j][k])
            board[j][k] = stack[-2]

        for l in range(r2-1, r1-1, -1):
            stack.append(board[l][k])
            board[l][k] = stack[-2]

        answer.append(min(stack))


    return answer

 



본질적으로 푸는 방법은 다 비슷한거 같다.

처음에는 그냥 최소값을 구하기만 하고 돌았을 때 값을 갱신시켜주지 않았는데

그러면 겹치는 경우에 처리를 못하니까 결국 한번 돌때마다 값을 갱신시켜줘야한다.

한줄 한줄 갱신시켜주기가 애매해서 최초에는 값 전체를 다 한번에 갱신시켜주려고 했다.

문제에 일반항이 나와있었기 때문에 갱신시키는 거 자체는 문제가 없었는데 문제는 다중처리하기가 애매했다.

그래서 그냥 한줄 한줄 갱신하는 식으로 바꿨는데 시간이 나면 한번에 전체를 갱신하는 방향으로 시도해보려고 한다

그게 코드도 훨씬 짧고 간결해질거같아서.

'취준 > 프로그래머스' 카테고리의 다른 글

괄호 변환 - 파이썬  (0) 2022.06.13
메뉴 리뉴얼 - 파이썬  (0) 2022.06.06
짝 지어 제거하기 - 파이썬  (0) 2022.06.02
더 맵게 - 파이썬  (0) 2022.06.01
기능개발 - 파이썬  (0) 2022.05.30

+ Recent posts