[νλ‘κ·Έλλ¨Έμ€ | Python] νλ ¬ ν λ리 νμ νκΈ°
π λ¬Έμ μ 보
- κ΄λ ¨ κ°λ : 2μ°¨μ νλ ¬ ꡬν
- λμ΄λ : Level 2
- λ¬Έμ λ§ν¬ : https://programmers.co.kr/learn/courses/30/lessons/77485?language=python3
μ½λ©ν μ€νΈ μ°μ΅ - νλ ¬ ν λ리 νμ νκΈ°
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
π λ¬Έμ μ€λͺ
λ¬Έμ μ€λͺ
rows x columns ν¬κΈ°μΈ νλ ¬μ΄ μμ΅λλ€. νλ ¬μλ 1λΆν° rows x columnsκΉμ§μ μ«μκ° ν μ€μ© μμλλ‘ μ νμμ΅λλ€. μ΄ νλ ¬μμ μ§μ¬κ°ν λͺ¨μμ λ²μλ₯Ό μ¬λ¬ λ² μ νν΄, ν λ리 λΆλΆμ μλ μ«μλ€μ μκ³λ°©ν₯μΌλ‘ νμ μν€λ € ν©λλ€. κ° νμ μ (x1, y1, x2, y2)μΈ μ μ 4κ°λ‘ νννλ©°, κ·Έ μλ―Έλ λ€μκ³Ό κ°μ΅λλ€.
- x1 ν y1 μ΄λΆν° x2 ν y2 μ΄κΉμ§μ μμμ ν΄λΉνλ μ§μ¬κ°νμμ ν λ리μ μλ μ«μλ€μ ν μΉΈμ© μκ³λ°©ν₯μΌλ‘ νμ ν©λλ€.
λ€μμ 6 x 6 ν¬κΈ° νλ ¬μ μμμ λλ€.

μ΄ νλ ¬μ (2, 2, 5, 4) νμ μ μ μ©νλ©΄, μλ κ·Έλ¦Όκ³Ό κ°μ΄ 2ν 2μ΄λΆν° 5ν 4μ΄κΉμ§ μμμ ν λλ¦¬κ° μκ³λ°©ν₯μΌλ‘ νμ ν©λλ€. μ΄λ, μ€μμ 15μ 21μ΄ μλ μμμ νμ νμ§ μλ κ²μ μ£ΌμνμΈμ.

νλ ¬μ μΈλ‘ κΈΈμ΄(ν κ°μ) rows, κ°λ‘ κΈΈμ΄(μ΄ κ°μ) columns, κ·Έλ¦¬κ³ νμ λ€μ λͺ©λ‘ queriesκ° μ£Όμ΄μ§ λ, κ° νμ λ€μ λ°°μ΄μ μ μ©ν λ€, κ·Έ νμ μ μν΄ μμΉκ° λ°λ μ«μλ€ μ€ κ°μ₯ μμ μ«μλ€μ μμλλ‘ λ°°μ΄μ λ΄μ return νλλ‘ solution ν¨μλ₯Ό μμ±ν΄μ£ΌμΈμ.
μ νμ¬ν
- rowsλ 2 μ΄μ 100 μ΄νμΈ μμ°μμ λλ€.
- columnsλ 2 μ΄μ 100 μ΄νμΈ μμ°μμ λλ€.
- μ²μμ νλ ¬μλ κ°λ‘ λ°©ν₯μΌλ‘ μ«μκ° 1λΆν° νλμ© μ¦κ°νλ©΄μ μ νμμ΅λλ€.
- μ¦, μ무 νμ λ νμ§ μμμ λ, i ν j μ΄μ μλ μ«μλ ((i-1) x columns + j)μ λλ€.
- queriesμ νμ κ°μ(νμ μ κ°μ)λ 1 μ΄μ 10,000 μ΄νμ λλ€.
- queriesμ κ° νμ 4κ°μ μ μ [x1, y1, x2, y2]μ
λλ€.
- x1 ν y1 μ΄λΆν° x2 ν y2 μ΄κΉμ§ μμμ ν λ리λ₯Ό μκ³λ°©ν₯μΌλ‘ νμ νλ€λ λ»μ λλ€.
- 1 ≤ x1 < x2 ≤ rows, 1 ≤ y1 < y2 ≤ columnsμ λλ€.
- λͺ¨λ νμ μ μμλλ‘ μ΄λ£¨μ΄μ§λλ€.
- μλ₯Ό λ€μ΄, λ λ²μ§Έ νμ μ λν λ΅μ 첫 λ²μ§Έ νμ μ μ€νν λ€μ, κ·Έ μνμμ λ λ²μ§Έ νμ μ μ€ννμ λ μ΄λν μ«μ μ€ μ΅μκ°μ ꡬνλ©΄ λ©λλ€.
μ μΆλ ₯ μ
rows | columns | queries | result |
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] |
100 | 97 | [[1,1,100,97]] | [1] |
μ μΆλ ₯ μ μ€λͺ
μ μΆλ ₯ μ #1
- νμ μ μννλ κ³Όμ μ κ·Έλ¦ΌμΌλ‘ νννλ©΄ λ€μκ³Ό κ°μ΅λλ€.
μ μΆλ ₯ μ #2
- νμ μ μννλ κ³Όμ μ κ·Έλ¦ΌμΌλ‘ νννλ©΄ λ€μκ³Ό κ°μ΅λλ€.
μ μΆλ ₯ μ #3
- μ΄ μμμμλ νλ ¬μ ν λ리μ μμΉν λͺ¨λ μΉΈλ€μ΄ μμ§μ λλ€. λ°λΌμ, νλ ¬μ ν λ리μ μλ μ μ€ κ°μ₯ μμ μ«μμΈ 1μ΄ λ°λ‘ λ΅μ΄ λ©λλ€.
π λ¬Έμ νμ΄
λ°©λ² 1. λ°λ³΅λ¬Έ νμ©
def solution(rows, columns, queries):
answer = []
# νλ ¬ μμ±νκΈ°
matrix = [[0 for i in range(columns)] for j in range(rows)]
m = 1
for r in range(rows):
for c in range(columns):
matrix[r][c] = m
m += 1
# νμ μν€κΈ°
for x1, y1, x2, y2 in queries:
tmp = matrix[x1-1][y1-1]
minimum = tmp
for k in range(x1-1, x2-1): # top
test = matrix[k + 1][y1 - 1]
matrix[k][y1 - 1] = test
minimum = min(minimum, test)
for k in range(y1-1, y2 - 1): # right
test = matrix[x2 - 1][k + 1]
matrix[x2 - 1][k] = test
minimum = min(minimum, test)
for k in range(x2-1, x1-1, -1): # bottom
test = matrix[k - 1][y2 - 1]
matrix[k][y2 - 1] = test
minimum = min(minimum, test)
for k in range(y2-1, y1-1, -1): # left
test = matrix[x1 - 1][k - 1]
matrix[x1 - 1][k] = test
minimum = min(minimum, test)
matrix[x1 - 1][y1] = tmp
answer.append(minimum)
return answer
λ°©λ² 2. stack μλ£κ΅¬μ‘° νμ©
def solution(rows, columns, queries):
answer = []
# νλ ¬ μμ±νκΈ°
board = [[i+(j)*columns for i in range(1,columns+1)] for j in range(rows)]
# ν
λ리 νμ μν€κΈ°
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
λ°©λ² 3. dequeμ rotate νμ©
from collections import deque
def solution(rows, columns, queries):
arr = [[i+columns*j for i in range(1,columns+1)] for j in range(rows)]
answer, result = deque(), []
for i in queries:
a,b,c,d = i[0]-1,i[1]-1,i[2]-1,i[3]-1
for x in range(d-b):
answer.append(arr[a][b+x])
for y in range(c-a):
answer.append(arr[a+y][d])
for z in range(d-b):
answer.append(arr[c][d-z])
for k in range(c-a):
answer.append(arr[c-k][b])
answer.rotate(1)
result.append(min(answer))
for x in range(d-b):
arr[a][b+x] = answer[0]
answer.popleft()
for y in range(c-a):
arr[a+y][d] = answer[0]
answer.popleft()
for z in range(d-b):
arr[c][d-z] = answer[0]
answer.popleft()
for k in range(c-a):
arr[c-k][b] = answer[0]
answer.popleft()
return result
π‘ What I learned