728x90
문제 보기
구현, 시뮬레이션 문제이다.
A[r][c]에 들어있는 값이 k가 되기 위한 연산의 최소 시간을 출력하면 된다.
최소 시간?
연산의 순서가 정해져 있기 때문에 최소라는 말은 큰 의미가 없다. A[r][c] 값을 k로 만들 수 있는 특별한 연산 방법이 있는 것이 아니라, 연산의 순서에 따라 진행하면서 A[r][c]의 값이 k인지 주기적으로 확인하면 된다.
배열의 크기
연산을 진행하다 보면 행 또는 열의 크기가 변한다. 하지만 행 또는 열의 크기가 100을 넘어가는 경우는 의미없는 값이기 때문에 처음부터 배열 크기를 100 x 100으로 선언하면 행 또는 열의 크기 변화를 신경 쓸 필요가 없다.
행과 열의 크기 비교
행과 열의 크기 변화는 신경 쓸 필요가 없지만 행의 최대 크기와 열의 최대 크기는 알아야 한다. 최대 크기에 따라 수행하는 연산이 다르기 때문이다. 최대 행과 열 크기는 아래 방법으로 구하였다.
def find_col_index(arr): # 최대 열 크기 계산
index = 0
for i in range(len(arr)):
for j in range(len(arr)):
if arr[i][j] == 0:
index = max(index, j)
break
return index
def find_row_index(arr): # 최대 행 크기 계산
index = 0
for i in range(len(arr)):
for j in range(len(arr)):
if arr[j][i] == 0:
index = max(index, j)
break
return index
R 연산 vs C 연산
R 연산과 C 연산의 알고리즘 로직은 아래와 동일하다.
1. 0을 제외한 수의 갯수를 파악한다. -> Counter 함수 사용
2. (수, 등장 횟수) 순으로 정렬하고, 정렬된 결과를 100개까지만 넣는다.
전체적인 알고리즘 로직은 아래와 같습니다.
1. 행과 열의 크기를 비교한다.
2. 연산을 수행한다.
3. A[r][c] 값을 k와 비교한다
코드
from collections import Counter
def r_operation(arr): # R 연산
for i in range(len(arr)):
temp = []
for j in range(len(arr[i])):
if arr[i][j] != 0:
temp.append(arr[i][j])
counter = Counter(temp)
temp = []
for key in counter.keys():
temp.append((key, counter[key]))
temp = sorted(temp, key=lambda x: (x[1], x[0]))
for j in range(50):
if j < len(temp):
arr[i][j * 2] = temp[j][0]
arr[i][j * 2 + 1] = temp[j][1]
else:
arr[i][j * 2] = 0
arr[i][j * 2 + 1] = 0
return arr
def c_operation(arr): # C 연산
for i in range(len(arr)):
temp = []
for j in range(len(arr)):
if arr[j][i] != 0:
temp.append(arr[j][i])
counter = Counter(temp)
sort_arr = []
for key in counter.keys():
sort_arr.append((key, counter[key]))
sort_arr = sorted(sort_arr, key=lambda x: (x[1], x[0]))
for j in range(50):
if j < len(sort_arr):
arr[j * 2][i] = sort_arr[j][0]
arr[j * 2 + 1][i] = sort_arr[j][1]
else:
arr[j * 2][i] = 0
arr[j * 2 + 1][i] = 0
return arr
def find_col_index(arr):
index = 0
for i in range(len(arr)):
for j in range(len(arr)):
if arr[i][j] == 0:
index = max(index, j)
break
return index
def find_row_index(arr):
index = 0
for i in range(len(arr)):
for j in range(len(arr)):
if arr[j][i] == 0:
index = max(index, j)
break
return index
if __name__ == "__main__":
R, C, K = map(int, input().split())
array = [[0] * 101 for _ in range(101)]
for i in range(3):
a, b, c = map(int, input().split())
array[i][0], array[i][1], array[i][2] = a, b, c
flag = True
for i in range(0, 101):
if array[R - 1][C - 1] == K:
print(i)
flag = False
break
if find_row_index(array) >= find_col_index(array):
array = r_operation(array)
else:
array = c_operation(array)
if flag:
print(-1)
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[ 백준 17136 ] 색종이 붙이기 - Python (0) | 2020.10.16 |
---|---|
[ 백준 2463 ] 비용 - Python (0) | 2020.10.08 |
[ 백준 17142 ] 연구소 3 - Python (0) | 2020.09.21 |
[ 백준 17837 ] 새로운 게임 2 (0) | 2020.09.20 |
[ 백준 17779 ] 게리맨더링 2 - Python (0) | 2020.09.20 |