Problem Solving/Programmers

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ | Python] ν–‰λ ¬ ν…Œλ‘λ¦¬ νšŒμ „ν•˜κΈ°

minzhen 2022. 6. 15. 19:24

πŸ“’  문제 정보

 

πŸ”’  문제 μ„€λͺ…

더보기

문제 μ„€λͺ…

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

 

 

❗
κ΅¬ν˜„ 문제 ν•΄κ²° μ‹œ, λ³€μˆ˜μ™€ 인덱슀 등을 ν™•μ‹€νžˆ μ •λ¦¬ν•˜κ³  μ½”λ“œ 짜기 μ‹œμž‘ν•˜κΈ°!