- 문제 : https://school.programmers.co.kr/learn/courses/30/lessons/77485
Lv2 문제고, 스스로 푼 문제다!
시간은 70분 걸렸다
주의해야할 점
- 2번 시계 방향으로 원소를 옮기면 해당 줄에서 중복된 값이 입력되므로, 각 진행 방향의 역방향으로 값을 옮겨야 원하는 행렬이 된다 (8, 9, 10을 왼쪽에서 오른쪽으로 옮기게 되면 8, 8, 10 -> 8, 8, 8로 변경되므로 8,8,9와는 다른 값이다)
- edge 값은 ni에 미리 저장한후 방향에 맞는 값으로 바꿔준다
풀이 로직
queries의 원소 갯수만큼 회전을 진행하는데, 각 회전마다 최솟값을 모아서 출력한다
바로 떠오른 풀이 로직 순서는 다음과 같다.
1. 문제에 해당하는 행렬 만들기
: 행마다 나오는 숫자 바로 만들기 어려워서 그냥 전체 수를 하나의 배열로 만든 뒤, columns 길이 만큼씩 잘라서 rows만큼 반복해서 matrix를 생성했다
2. queries에 주어진 위치들은 실제 행렬 위치 +1, +1 이므로 queries 각 원소에 -1을 해준다
3. result에는 각 회전시 지나가는 모든 숫자들을 추가한다. (매번 최댓값을 비교하면 시간이 오래 걸릴 것 같아서, 해당 하는 숫자들 다 모아놓고 마지막에 최댓값을 출력하려고 했다)
4. 시계 방향으로 원소 옮기기
첫 번째 주의해야할 점에서 언급한 것처럼 주어진 방향과 반대되는 방향으로 로직을 만들었다.
range에 해당 값은 print(matrix) 해가면서 맞췄다
3번째와 4번째 방향을 처리할 때 좀 어려웠다
3. 옮길 때 edge 값 처리하는 방법
회전을 진행하면서 가장 끝 위치에는 이전 값으로 덮어져서 따로 저장해야한다.
이는 n1 ~ n4로 미리 설정해서 원래 값을 보존한 뒤 경우에 맞춰서 추가하면 된다
(각 방향에 대한 설명 구체적으로 필요할 것 같음)
- 정답 풀이 :
def solution(rows, columns, queries):
temp = [i for i in range(1, rows * columns + 1)]
matrix = []
index = 0
for _ in range(rows):
matrix.append(temp[index : index + columns])
index += columns
answer = []
for query in queries:
a1, a2, b1, b2 = query
a1, a2, b1, b2 = a1 - 1, a2 - 1, b1 - 1, b2 - 1
result = []
n1, n2, n3, n4 = matrix[a1][b2], matrix[b1][b2], matrix[b1][b2], matrix[b1][a2]
for i in range(b2, a2, -1):
matrix[a1][i] = matrix[a1][i - 1]
result.append(matrix[a1][i])
for i in range(b1, a1, -1):
if i == a1 + 1:
matrix[i][b2] = n1
else:
matrix[i][b2] = matrix[i - 1][b2]
result.append(matrix[i][b2])
for i in range(a2, b2):
if i == b2 - 1:
matrix[b1][i] = n3
else:
matrix[b1][i] = matrix[b1][i + 1]
result.append(matrix[b1][i])
for i in range(a1, b1):
if i == b1 - 1:
matrix[i][a2] = n4
else:
matrix[i][a2] = matrix[i + 1][a2]
result.append(matrix[i][a2])
answer.append(min(result))
return answer
'코딩테스트 > 기출' 카테고리의 다른 글
[2021 카카오 채용연계형 인턴십 / 프로그래머스] 81302번: 거리두기 확인하기 (다시) (0) | 2022.10.25 |
---|---|
[Summer/Winter Coding(~2018) / 프로그래머스] 12978번 : 배달 (0) | 2022.10.22 |
[2020 카카오 인턴십 / 프로그래머스] 67257번 : 수식 최대화 (다시) (0) | 2022.10.21 |
[연습 문제 / 프로그래머스] 12936번 : 줄 서는 방법 (0) | 2022.10.20 |
[2018 KAKAO BLIND RECRUITMENT / 프로그래머스] 17683번 : [3차] 방금 그 곡 (0) | 2022.10.20 |