chldkato

백준 17140 이차원 배열과 연산 (파이썬) 본문

백준

백준 17140 이차원 배열과 연산 (파이썬)

chldkato 2020. 3. 4. 23:14

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

1. 연산을 하지 않아도 될 경우 0을 출력하고 끝낸다

2. c연산을 해야하는 경우 배열을 transpose한다. 연산을 끝내고 다시 transpose해야 하므로 변수로 저장해둔다

3. cnt 배열로 숫자가 몇 번 나오는지 세준다. 이 때 0은 제외한다

4. temp_row에 [나온 횟수, 숫자] 로 append한 후 정렬한다

5. next_a에 각 row를 붙여주고 최대 길이를 저장해둔다

6. 최대길이가 안되는 row에는 그 수만큼 0을 추가한다

7. c연산이면 다시 transpose 해준다

8. a[r-1][c-1]에 k가 있는지 확인한다. 1부터 100까지 과정을 반복

import sys

input = sys.stdin.readline

r, c, k = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(3)]

if len(a) > r-1 and len(a[0]) > c-1:
    if a[r-1][c-1] == k:
        print(0)
        sys.exit()

ans = 1
while ans <= 100:
    next_a, max_len, is_transpose = [], 0, 0
    if len(a) < len(a[0]):
        a = [list(x) for x in zip(*a)]
        is_transpose = 1

    for row in a:
        maxn = max(row)
        cnt = [0 for _ in range(maxn+1)]
        temp_row = []
        for v in row:
            if v > 0:
                cnt[v] += 1
        for index, key in enumerate(cnt):
            if key:
                temp_row.append([key, index])
        temp_row.sort()
        temp_row2 = []
        for l in temp_row:
            temp_row2.extend([l[1], l[0]])
        next_a.append(temp_row2)
        max_len = max(max_len, len(temp_row2))

    for row in next_a:
        if len(row) < max_len:
            z = [0 for _ in range(max_len - len(row))]
            row.extend(z)
    a = next_a

    if is_transpose:
        a = [list(x) for x in zip(*a)]

    if len(a) > r-1 and len(a[0]) > c-1:
        if a[r-1][c-1] == k:
            print(ans)
            sys.exit()
    ans += 1
print(-1)

Comments