데이터사이언스 기록기📚

[프로그래머스/Python] Level 2_행렬 테두리 회전하기 (2021 Dev-Match:웹 백엔드 개발자(상반기)) 본문

Coding Test/프로그래머스(Python)

[프로그래머스/Python] Level 2_행렬 테두리 회전하기 (2021 Dev-Match:웹 백엔드 개발자(상반기))

syunze 2023. 9. 26. 14:15

📌문제 유형

2021 Dev-Match:웹 백엔드 개발자(상반기) (완전탐색)

 

📌문제

 

프로그래머스

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

programmers.co.kr

 

📌나의 문제풀이

- 인덱스랑 움직이는거 헷갈릴 수 있어서 그림 필수

- 첫번째 가로는 왼쪽 위 제외하고 회전, 두번째 세로는 x1 다음 줄부터 x2 직전 줄까지 회전, 두번째 가로는 y2~y1 직전, 첫번째 세로는 x2~x1직후까지

- 주의 : 마지막 숫자 넣을 때, 가장 작은 값인지 확인하기(이거 안넣어서 틀렸음)

def solution(rows, columns, queries):
    answer = []
    
    # 행렬 만들기
    maps = [[0 for _ in range(columns)] for _ in range(rows)]
    for i in range(rows):
        for j in range(columns):
            maps[i][j] = i * columns + (j+1)
    
    for x1,y1,x2,y2 in queries:
        min_ = rows * columns
        
        # (x1,y1,x2,y2) -> x1-1, y1-1로 접근하기
        # 첫째줄 가로 변경
        before_num = maps[x1-1][y1-1]
        for k in range(y1, y2):
            if before_num < min_:
                min_ = before_num
            next_num = maps[x1-1][k]
            maps[x1-1][k] = before_num
            before_num = next_num
            
        # 둘째줄 세로 변경
        for n in range(x1,x2-1):
            if before_num < min_:
                min_ = before_num
            next_num = maps[n][y2-1]
            maps[n][y2-1] = before_num
            before_num = next_num

            
        # 둘째줄 가로 변경
        for m in range(y2-1,y1-1,-1):
            if before_num < min_:
                min_ = before_num
            next_num = maps[x2-1][m]
            maps[x2-1][m] = before_num
            before_num = next_num
            
        # 첫째줄 세로 변경
        for l in range(x2-1, x1-1,-1):
            if before_num < min_:
                min_ = before_num
            next_num = maps[l][y1-1]
            maps[l][y1-1] = before_num
            before_num = next_num
            
        if before_num < min_:
                min_ = before_num
        maps[x1-1][y1-1] = before_num
        answer.append(min_)
        
    return answer

 

📌다른 사람의 문제풀이

- Stack(마지막에 넣은 것 먼저 뽑는 것) 이용해서 2개 전 값 빼기

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

 

 

📌리뷰

- 마지막 값도 최소값에 포함되었는지 확인하기

- 다른 사람들이 자주 하는 실수

  • 초기배열 잘못 생성

 

728x90
Comments