https://www.acmicpc.net/problem/17140
접근
새로운 알고리즘은 따로 없이 문제가 원하는 계산만 해주면 되는 문제였다. 하지만 문제를 푸는 와중에 index error를 여러번 받으면서 그 반례를 해결하는 것이 조금 번거로웠다.
처음에 주어지는 r, c가 배열 바깥에 존재하여 A[r][c]와 k를 비교할 때 인덱스 에러를 만드는 경우를 고려하여 문제를 해결할 수 있었다.
코드
r, c, k = map(int, input().split())
r -= 1
c -= 1
matrix = [list(map(int, input().split())) for _ in range(3)]
t = 0
def process(matrix):
row_val = len(matrix)
col_val = len(matrix[0])
if row_val < col_val:
# 열수 < 행수 조건일 경우 주어진 배열을 transpose 해주고 마지막에 다시 transpose 해줌으로써 코드를 간결히 하였다.
matrix = list(zip(*matrix))
next_row_val = col_val
else:
next_row_val = row_val
new_matrix = []
next_col_val = 0
for i in range(len(matrix)):
# 계산하는 행 또는 열을 탐색하여 {수: 해당 수의 개수} 형태로 저장하는 딕셔너리
values = {}
for n in matrix[i]:
if n == 0:
# 0은 카운트하지 않는다.
continue
if n not in values.keys():
values[n] = 1
else:
values[n] += 1
# 딕셔너리의 아이템들을 리스트로 만들고 문제에 주어진 조건에 맞추어 정렬해준다.
tmp = list(values.items())
tmp.sort(key=lambda x: x[0])
tmp.sort(key=lambda x: x[1])
values_to_list = []
for a, b in tmp:
values_to_list.append(a)
values_to_list.append(b)
new_matrix.append(values_to_list)
# 리스트의 최대 길이를 저장하여 다음 행렬의 크기를 결정해준다.
next_col_val = max(next_col_val, len(values_to_list))
next_col_val = min(next_col_val, 100)
matrix = [[0] * next_col_val for _ in range(next_row_val)]
for i in range(next_row_val):
max_j = min(100, len(new_matrix[i]))
for j in range(max_j):
matrix[i][j] = new_matrix[i][j]
if row_val < col_val:
# 처음에 transpose 해주었을 경우 이를 다시 transpose 해주어 되돌린다.
matrix = list(zip(*matrix))
return matrix
flag = 0
for i in range(101):
try:
# matrix[r][c] 배열 범위 바깥에 있을 경우 인덱스에러를 일으키므로 조건을 걸어준다.
kk = matrix[r][c]
except:
kk = 0
if kk == k:
flag = 1
break
matrix = process(matrix)
if flag:
print(i)
else:
print(-1)
더 생각해 볼 것?
...
코드나 내용 관련 조언, 부족한 점 및 질문 언제든 환영합니다!
반응형
'코딩 > 백준 (Python)' 카테고리의 다른 글
백준 17837번: 새로운 게임 2 (Python) (0) | 2022.03.13 |
---|---|
백준 17779번: 게리맨더링2 (Python) (0) | 2022.03.13 |
백준 17142번: 연구소3 (Python) (0) | 2022.03.12 |
백준 17143번: 낚시왕 (Python) (0) | 2022.03.09 |
백준 17144번: 미세먼지 안녕! (Python) (0) | 2022.03.09 |
최근댓글