STUDY/Algorithm

[백준] 17140 이차원 배열과 연산 python

sinawi95 2022. 3. 25. 11:13
728x90

https://www.acmicpc.net/problem/17140

 

17140번: 이차원 배열과 연산

첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.

www.acmicpc.net

시뮬레이션 문제이다.

매 단계마다 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연산은 따로 구현했는데 비슷해서 합칠수도 있을 것같다.