[Python] 백준 17140번: 이차원 배열과 연산
알고리즘/[Python] 백준

[Python] 백준 17140번: 이차원 배열과 연산

출처 : https://www.acmicpc.net/problem/17140

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

  • R연산과 C연산을 따로 만들 필요가 없다.
  • C 연산 : 2차원 배열을 Transpose → R 연산 → Transpose
  • r, c, k 를 입력받으면 board[r-1][c-1] = k 인지 확인한다. 혹은 시간이 100을 넘어서는지 확인한다.
  • Python으로 2차원 배열을 Transpose하는 것은 쉽다.
    • list(map(list, zip(*board))) 를 해보자. (board = 2차원 배열)

# code 

from collections import Counter
from functools import reduce
 
## R 연산
def R(array):
    mx = 0  # 가장 긴 리스트의 길이
    for i in range(len(array)):
        X = Counter(array[i])
        del X[0]  # 수를 정렬할 때, 0은 제외
        X = list(X.items())
        X.sort(key=lambda x: (x[1], x[0]))
        if len(X) > 50: X = X[:50]  # 크기가 100을 넘기면 안됨.
        array[i] = reduce(lambda x, y: list(x) + list(y), X[1:], list(X[0]))
        mx = max(mx, len(array[i]))
 
    ## 가장 긴 리스트에 맞춰, 0을 추가한다.
    for i in range(len(array)):
        if len(array[i]) < mx:
            array[i].extend([0* (mx - len(array[i])))
 
 
def main():
    r, c, k = map(int, input().split())
    r, c = r - 1, c - 1
 
    board = [list(map(int, input().split())) for _ in range(3)]
    time = 0  # 시간
    if r < len(board) and c < len(board[0]):
        if board[r][c] == k: return time
 
    while True:
        if len(board) >= len(board[0]):  # 행의 개수 >= 열의 개수, R연산
            R(board)                     # R 연산
        else:                                     # 행의 개수 < 열의 개수, C연산
            board = list(map(list, zip(*board)))  # 트랜스포즈
            R(board)                              # R 연산
            board = list(map(list, zip(*board)))  # 트랜스포즈
        time += 1
        if time > 100return -1
        if r < len(board) and c < len(board[0]):
            if board[r][c] == k: return time
 
print(main())
cs