취준/백준

[백준][Python][17140][시뮬레이션] 이차원 배열과 연산

puff 2020. 3. 21. 18:28

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

시뮬레이션 문제다.

 

조건에 맞는 계산을 할때 Counter를 쓰면 편하다. (thatsort, rowcmd)

  1. Counter로 (item, 갯수 ) 들의 목록을 만든다
  2. 이걸 갯수, item 순서로 정렬한다.
  3. 0은 제외한다
  4. 가장 긴 길이에 맞춰 0을 추가해준다.

그리고 위의 계산을 가로 단위로 만든 뒤, 세로 ->가로 -> 연산 ->세로 로 바꾸는 식으로 재활용이 가능하다.(colcmd)

 

 

import sys
from collections import deque,OrderedDict,Counter

r,c,k = [int(i) for i in sys.stdin.readline().split()]


d = []

for i in range(3):
    d.append([int(i) for i in sys.stdin.readline().split()])


def thatsort(l):
    count = Counter(l)
    s = sorted(count.items(),key=lambda x:(x[1],x[0]))
    ret = []
    for i in s:
        if i[0]!=0:
            ret = ret+list(i)
        
    return ret


def rowcmd(m):
    ansmap = []
    maxlen = 0
    for i in range(len(m)):
        tmp = thatsort(m[i])
        maxlen = max(maxlen, len(tmp))
        ansmap.append(tmp)
        
    
    for i in range(len(ansmap)):
        ansmap[i] = ansmap[i]+[0]*(maxlen-len(ansmap[i]))
        
    return ansmap
    
    
def colcmd(m):
    m = [list(i) for i in zip(*m)]

    ret = rowcmd(m)
    return [list(i) for i in zip(*ret)]


def whichcmd(m):
    nr = len(m)
    nc = 0
    for i in range(nr):
        nc = max(nc, len(m[i]))
    if nr>= nc:
        return True, nr,nc
    
    else:
        return False, nr,nc
    
ans = 0
cr ,cc = 3,3
while True:

    if ans >100:
        print(-1)
        sys.exit()
    if r-1< cr and c-1<cc: 
        if d[r-1][c-1]==k:
            print(ans)
            sys.exit()
    
    v,cr,cc = whichcmd(d)
    if v:
        d = rowcmd(d)
        ans+=1
    else:
        d = colcmd(d)
        ans+=1
    _,cr,cc = whichcmd(d)