백준
백준 17140 이차원 배열과 연산 (파이썬)
chldkato
2020. 3. 4. 23:14
https://www.acmicpc.net/problem/17140
17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
1. 연산을 하지 않아도 될 경우 0을 출력하고 끝낸다
2. c연산을 해야하는 경우 배열을 transpose한다. 연산을 끝내고 다시 transpose해야 하므로 변수로 저장해둔다
3. cnt 배열로 숫자가 몇 번 나오는지 세준다. 이 때 0은 제외한다
4. temp_row에 [나온 횟수, 숫자] 로 append한 후 정렬한다
5. next_a에 각 row를 붙여주고 최대 길이를 저장해둔다
6. 최대길이가 안되는 row에는 그 수만큼 0을 추가한다
7. c연산이면 다시 transpose 해준다
8. a[r-1][c-1]에 k가 있는지 확인한다. 1부터 100까지 과정을 반복
import sys
input = sys.stdin.readline
r, c, k = map(int, input().split())
a = [list(map(int, input().split())) for _ in range(3)]
if len(a) > r-1 and len(a[0]) > c-1:
if a[r-1][c-1] == k:
print(0)
sys.exit()
ans = 1
while ans <= 100:
next_a, max_len, is_transpose = [], 0, 0
if len(a) < len(a[0]):
a = [list(x) for x in zip(*a)]
is_transpose = 1
for row in a:
maxn = max(row)
cnt = [0 for _ in range(maxn+1)]
temp_row = []
for v in row:
if v > 0:
cnt[v] += 1
for index, key in enumerate(cnt):
if key:
temp_row.append([key, index])
temp_row.sort()
temp_row2 = []
for l in temp_row:
temp_row2.extend([l[1], l[0]])
next_a.append(temp_row2)
max_len = max(max_len, len(temp_row2))
for row in next_a:
if len(row) < max_len:
z = [0 for _ in range(max_len - len(row))]
row.extend(z)
a = next_a
if is_transpose:
a = [list(x) for x in zip(*a)]
if len(a) > r-1 and len(a[0]) > c-1:
if a[r-1][c-1] == k:
print(ans)
sys.exit()
ans += 1
print(-1)