알고리즘/프로그래머스

[프로그래머스]Lv2. 행렬 테두리 회전하기(Python)

cha_eyoon 2024. 2. 19. 18:22

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

 

프로그래머스

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

programmers.co.kr

 

문제 접근

 

구하려는 것은 각 회전들이 일어난 후에 그 회전에 의해 위치가 바뀐 숫자들 중 가장 작은 숫자들을 순서대로 배열에 담는 것이다.

하지만 이를 구하기 전에는 우선 회전을 제대로 시켜야한다.

접근은 하였으나 너무 시간이 오바된 것 같아 멈추었다.(코드1까지 작성 완)

 

(첫 시도)

1. 우선 배열을 (rows+1) * (columns+1)만큼 선언한 후에 다 0으로 만든 후 (1, 1)에서 (rows, columns)까지 각 숫자를 담는다. 

2. 그 다음 주어진 회전들의 목록을 변수에 담고, 이를 사용해 시계방향의 회전이 일어날 때 테두리의 값이 어떻게 변하는 지 좌우변, 위아래변을 나누어서 조건문을 작성해 구분 짓는다. => 특징을 찾아 분기하는 데 시간을 허비 

 

(마무리)

좌, 우, 상, 하로 나누어서 반복문을 수정하였다. 훨씬 깔끔하다!!

 

코드

 

(첫 시도)

def solution(rows, columns, queries):
    
    answer = 0
    graph = [[0] * (rows+1) for _ in range(columns+1)]
    num = 1
    
    for i in range(1, rows+1):
        for j in range(1, columns+1):
            graph[i][j] = num
            num += 1 
    
    for query in queries:
        x_1 = query[0]
        y_1 = query[1]
        x_2 = query[2]
        y_2 = query[3]
        
        N = (x_2 - x_1) + 1
        M = (y_2 - y_1) + 1 
        
        for i in range(x_1, x_2+1)
            for j in range(y_1, y_2+1):
                if j == y_2:	# 오른쪽 위 끝 친구
                    if i == x_2:
                        graph[i][j] = graph[i][j-1]	#오른쪽 아래 친구 
                    else:
                        graph[i][j] = graph[i+1][j]	#오른쪽 변 
                elif j == y_1:	# 왼쪽 아래 끝 친구
                    if i == x_1:
                        graph[i][j] = graph[i][j+1]
                    else:
                        graph[i][j] = graph[i-1][j]
                elif i == x_1 and j != y_2:
                    graph[i][j] = graph[i][j+1]
                elif i == x_2 and j != y_1:
                    graph[i][j] = graph[i][j-1] 
    
    
    return answer

 

(수정)

def solution(rows, columns, queries):
    
    
    answer = []
    graph = [[0] * columns for _ in range(rows)]
    num = 1
    
    for i in range(rows):
        for j in range(columns):
            graph[i][j] = num
            num += 1 
    
    for query in queries:
        x_1, y_1, x_2, y_2 = query
        
        tmp = graph[x_1-1][y_1-1]
        min_num = tmp	# 최소값을 초기화 
        
        # 왼쪽 세로줄 회전(x값이 증가하겠지?)
        for i in range(x_1-1, x_2-1):
            graph[i][y_1-1] = graph[i+1][y_1-1]
            min_num = min(min_num, graph[i][y_1-1])
        
        # 바닥줄 회전(y값이 감소하겠지?)
        for i in range(y_1-1, y_2-1):
            graph[x_2-1][i] = graph[x_2-1][i+1]
            min_num = min(min_num, graph[x_2-1][i])
        
        # 오른쪽 세로줄 회전(더 작은 값으로 대체 되겠지? 내려가니까!)
        for i in range(x_2-1, x_1-1, -1):
            graph[i][y_2-1] = graph[i-1][y_2-1]
            min_num = min(min_num, graph[i][y_2-1])
        
        # 윗줄 회전
        for i in range(y_2-1, y_1-1, -1):
            graph[x_1-1][i] = graph[x_1-1][i-1]
            min_num = min(min_num, graph[x_1-1][i])
        
        # 중요!! 회전의 시작점에 임시 저장한 값을 대입 
        graph[x_1-1][y_1] = tmp
        
        # 각 회전에서의 최소값을 결과 리스트에 추가 
        answer.append(min_num)
    
    return answer