본문 바로가기
Problem Solving/BOJ

[Python] 이차원 배열과 연산

by 부르르 2021. 4. 21.

www.acmicpc.net/problem/17140

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net


포인트

  • 두자리 이상의 수에 대해서 정렬하는 것을 고려
  • 100초까지 확인해야 하므로 101번까지 반복해야 함

Tip

  • 내장함수 zip(*arr) 을 사용하여 세로 줄에 대해서 정렬을 연산한다.
  • Defaultdic 과 DeepCopy를 사용한다.
  • 시간을 줄이기 위해 2차원 배열로 연산을 해보자

 

메모리 (제한: 512 MB)

129132 KB

시간  (제한: 0.5 초)

300 ms

결과

100%

from collections import defaultdict
from copy import deepcopy

def array_sort(dic):
    global max_len
    array = []
    for k, v in dic.items():
        array.append((k, v))
    arr = sorted(array, key=lambda p: p[1])
    new_dic = defaultdict(list)
    for a in arr:
        new_dic[a[1]].append(a[0])
    for d in new_dic.keys():
        new_dic[d].sort()
    s = []
    for k, v in new_dic.items():
        for i in v:
            s += [i, k]
    if len(s) > 100:
        s = s[:100]
    max_len = max(max_len, len(s))
    return s


r, c, k = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(3)]
time = 0
answer = -1
while time != 101:
    try:
        if A[r-1][c-1] == k:
            answer = time
            break
    except:
        pass
    max_len = 0
    num_r = len(A)
    num_c = len(A[0])
    if num_r >= num_c:
        _A = []
        for a in A:
            dic = defaultdict(int)
            for _a in a:
                if _a != 0: dic[_a] += 1
            _A.append(array_sort(dic))
        for a in _A:
            a += [0] * (max_len - len(a))
        A = deepcopy(_A)

    else:
        _A = []
        for a in zip(*A):
            dic = defaultdict(int)
            for _a in a:
                if _a != 0: dic[_a] += 1
            _A.append(array_sort(dic))
        for a in _A:
            a += [0] * (max_len - len(a))
        rotate_A = []
        for a in zip(*_A):
            rotate_A.append(list(a))
        A = deepcopy(rotate_A)
    time += 1

print(answer)

 

문제를 푸는데 도움이 된 테스트 케이스

# Input
1 1 1
11 12 13
11 12 11
11 11 11

# Output
3

 

728x90
반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[Python] 16234. 인구 이동  (0) 2021.04.24
[Python] 19238. 스타트 택시  (0) 2021.04.23
[Python] 17142. 연구소 3  (0) 2021.04.20
[Python] 16235. 나무 재테크  (0) 2021.04.15
[Python] 14503. 로봇 청소기  (0) 2021.04.14

댓글