728x90
https://www.acmicpc.net/problem/17140
시뮬레이션 문제이다.
매 단계마다 arr[R][C] == K인지 확인했고 다른 경우 정렬 연산을 하도록 구현했다.
정렬 연산은 다음과 같이 진행된다.
1. defaultdict로 수를 카운트한다.(등장횟수)
2. 수의 등장횟수와 숫자의 크기를 기준으로 오름차순으로 정렬
3. 행 or 열 갱신
3-1. 짝수 자리엔 수와 홀수 자리에 등장횟수를 넣어서 최대 100개까지 갱신한다.(0부터 시작이므로)
정렬연산을 반복하면서 answer를 1씩 증가시키고 조건을 만족시하거나 answer가 100을 넘기면 반복문을 종료시켰다.
# import sys; input = sys.stdin.readline
from collections import defaultdict
def main():
R, C, K = map(int, input().split())
R -= 1
C -= 1
arr = [[0 for _ in range(100)] for _ in range(100)]
for i in range(3):
for j, v in enumerate(map(int, input().split())):
arr[i][j] = v
# print(*arr, sep='\n')
num_r, num_c = 3, 3
answer = 0
while arr[R][C] != K and answer <= 100:
if num_r >= num_c:
# R 연산
for i in range(num_r): # 모든 행에 대해서 정렬 수행
# 각각의 수가 몇 번 나왔는지 확인
row_dict = defaultdict(int)
for j in range(num_c):
row_dict[arr[i][j]] += 1
# 0을 제외한 수 정렬
sorted_dict = sorted(row_dict, key=lambda x: (row_dict[x], x))
idx = 0
for k in sorted_dict:
if k == 0: continue
arr[i][idx] = k
arr[i][idx + 1] = row_dict[k]
idx += 2
if idx >= 100:
break
num_c = max(num_c, idx)
for j in range(idx, num_c + 1):
arr[i][j] = 0
else:
# C연산
for i in range(num_c): # 모든 열에 대해서 정렬 수행
# 각각의 수가 몇 번 나왔는지 확인
col_dict = defaultdict(int)
for j in range(num_r):
col_dict[arr[j][i]] += 1
# 0을 제외한 수 정렬
sorted_dict = sorted(col_dict, key=lambda x: (col_dict[x], x))
idx = 0
for k in sorted_dict:
if k == 0: continue
arr[idx][i] = k
arr[idx + 1][i] = col_dict[k]
idx += 2
if idx >= 100:
break
num_r = max(num_r, idx)
for j in range(idx, num_r + 1):
arr[j][i] = 0
answer += 1
# output
if answer > 100:
print(-1)
else:
print(answer)
if __name__ == "__main__":
main()
R연산과 C연산은 따로 구현했는데 비슷해서 합칠수도 있을 것같다.
'STUDY > Algorithm' 카테고리의 다른 글
[백준] 11559 Puyo Puyo, Python (0) | 2022.03.29 |
---|---|
[백준] 20058 마법사 상어와 파이어스톰 python (0) | 2022.03.28 |
[백준] 17135 캐슬디펜스 python (0) | 2022.03.24 |
[백준] 2234 성곽 python (0) | 2022.03.23 |
[백준] 17142 연구소 python (0) | 2022.03.22 |