알고리즘/프로그래머스
[프로그래머스]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