취준/백준
[백준][Python][17140][시뮬레이션] 이차원 배열과 연산
puff
2020. 3. 21. 18:28
문제 : https://www.acmicpc.net/problem/17140
시뮬레이션 문제다.
조건에 맞는 계산을 할때 Counter를 쓰면 편하다. (thatsort, rowcmd)
- Counter로 (item, 갯수 ) 들의 목록을 만든다
- 이걸 갯수, item 순서로 정렬한다.
- 0은 제외한다
- 가장 긴 길이에 맞춰 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)