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)