출처 : https://www.acmicpc.net/problem/17140
- R연산과 C연산을 따로 만들 필요가 없다.
- C 연산 : 2차원 배열을 Transpose → R 연산 → Transpose
- r, c, k 를 입력받으면 board[r-1][c-1] = k 인지 확인한다. 혹은 시간이 100을 넘어서는지 확인한다.
- Python으로 2차원 배열을 Transpose하는 것은 쉽다.
- list(map(list, zip(*board))) 를 해보자. (board = 2차원 배열)
# code
from collections import Counter
from functools import reduce
## R 연산
def R(array):
mx = 0 # 가장 긴 리스트의 길이
for i in range(len(array)):
X = Counter(array[i])
del X[0] # 수를 정렬할 때, 0은 제외
X = list(X.items())
X.sort(key=lambda x: (x[1], x[0]))
if len(X) > 50: X = X[:50] # 크기가 100을 넘기면 안됨.
array[i] = reduce(lambda x, y: list(x) + list(y), X[1:], list(X[0]))
mx = max(mx, len(array[i]))
## 가장 긴 리스트에 맞춰, 0을 추가한다.
for i in range(len(array)):
if len(array[i]) < mx:
array[i].extend([0] * (mx - len(array[i])))
def main():
r, c, k = map(int, input().split())
r, c = r - 1, c - 1
board = [list(map(int, input().split())) for _ in range(3)]
time = 0 # 시간
if r < len(board) and c < len(board[0]):
if board[r][c] == k: return time
while True:
if len(board) >= len(board[0]): # 행의 개수 >= 열의 개수, R연산
R(board) # R 연산
else: # 행의 개수 < 열의 개수, C연산
board = list(map(list, zip(*board))) # 트랜스포즈
R(board) # R 연산
board = list(map(list, zip(*board))) # 트랜스포즈
time += 1
if time > 100: return -1
if r < len(board) and c < len(board[0]):
if board[r][c] == k: return time
print(main())
|
cs |
'알고리즘 > [Python] 백준' 카테고리의 다른 글
[Python] 백준 17822번: 원판 돌리기 (0) | 2020.04.24 |
---|---|
[Python] 백준 17837번: 새로운 게임 2 (0) | 2020.04.23 |
[Python] 백준 1987번: 알파벳 (0) | 2020.04.19 |
(Python) 백준 17143번: 낚시왕 (0) | 2020.03.28 |
(Python) 백준 18809번: Gaaaaaaaaaarden (0) | 2020.03.25 |