본문 바로가기

Algorithm

이차원 배열과 연산 (17140번) - 백준 (BOJ)

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

 

백준 - 이차원 배열과 연산 (17140번)

 

난이도 : Gold 4

알고리즘 : Simulation

풀이 소요 시간 : 60분

 

import sys
input = sys.stdin.readline


def main(r, c, k):
    A = [list(map(int, input().split())) for _ in range(3)]
    r -= 1; c -= 1
    cnt = 0
    while len(A) <= r or len(A[0]) <= c or A[r][c] != k:
        if r < len(A) and c < len(A[0]) and A[r][c] == k:
            return cnt
        cnt += 1
        if cnt == 101:
            return -1
        
        if len(A[0]) <= len(A):
            max_len = 0
            for i in range(len(A)):
                counter = {}
                for v in A[i]:
                    if not v:  continue
                    counter[v] = counter.get(v, 0) + 1
                row = sorted([[v, c] for v, c in counter.items()], key=lambda x: (x[1], x[0]))
                A[i] = []
                for rr in row[:50]:
                    A[i].extend(rr)
                max_len = max(max_len, len(A[i]))
            for i in range(len(A)):
                A[i].extend([0] * (max_len - len(A[i])))
        else:
            B = []
            max_len = 0
            for col in zip(*A):
                counter = {}
                for v in col:
                    if not v:  continue
                    counter[v] = counter.get(v, 0) + 1
                row = sorted([[v, c] for v, c in counter.items()], key=lambda x: (x[1], x[0]))
                B.append([])
                for rr in row[:50]:
                    B[-1].extend(rr)
                max_len = max(max_len, len(B[-1]))
            for i in range(len(A[0])):
                B[i].extend([0] * (max_len - len(B[i])))
            A = [list(row) for row in zip(*B)]

    return cnt


if __name__ == '__main__':
    cnt = main(*map(int, input().split()))
    print(cnt)

 

dictionary와 list 처리가 꽤 까다로운 구현 문제였다.

행 길이 맞추기와 0 값 처리에 시간이 좀 걸렸다.

그리고 행 작업보다 열 작업을 구현하는게 좀 더 까다로웠다.

 

효율적이고 깔끔한 코드는 아닌 것 같지만

k가 100으로 제한되어 있어, 시간 초과 없이 통과한 것 같다.