백준 17140 이차원 배열과 연산

wook2·2021년 7월 31일
0

알고리즘

목록 보기
45/117

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

일반적인 구현에 관한 문제이다. 문제에서의 관건은 열을 정리할때 어떻게 깔끔하게 하냐가 관건이다.

파이썬에서 2차원 배열을 Tranpose시키는 방법을 활용하여 열을 정리하는 경우에 Tranpose를 한 후에 로직을 적용하고 다시 Tranpose를 하는 방식을 사용하면 쉽게 해결할 수 있다.

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

def checkoperator(a): ## R연산이면 True C연산이면 False
    row = len(a)
    col = len(a[0])
    if row >= col:
        return True
    else:
        return False

def sorting(board):
    rtn = []
    cnt = 0
    for row in board:
        d = {}
        for e in row:
            if e == 0:
                continue
            if e in d:
                d[e] += 1
            else:
                d[e] = 1
        t = list(zip(d.keys(),d.values()))
        t.sort(key = lambda x:(x[1], x[0]))
        if len(t) >= 100:
            t = t[0:100]
        tmp = []
        for x in t:
            tmp.append(x[0])
            tmp.append(x[1])
        cnt = max(cnt, len(tmp))
        rtn.append(tmp)
    for i in range(len(rtn)):
        while len(rtn[i]) != cnt:
            rtn[i].append(0)
    return rtn

time = 0
while time <= 100:
    if len(a) >= r and len(a[0]) >= c:
        if a[r-1][c-1] == k:
            break

    if checkoperator(a): ## R연산인경우
        a = sorting(a)
    else:
        a = list(map(list,zip(*a)))
        a = sorting(a)
        a = list(map(list,zip(*a)))
    time += 1

if time == 101:
    time = -1
print(time)
profile
꾸준히 공부하자

0개의 댓글