파이썬 문제풀이/구현

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

ari0930 2024. 3. 7. 00:44

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

문제

입력

첫째 줄에 r,ck가 주어지며

둘째 줄부터 배열 A에 들어 있는 수가가 주어진다

출력

A[r][c]=k 가 되기 위한 최소 시간을 출력하고 만약 100초가 지나도 k에 도달하지 못한다면 -1을 출력한다 

풀이

1. 행과 열의 갯수를 저장

2. 조건에 R 연산과 C연산을 수행하면 된다

3. 이때 R 연산과 C연산은 방식은 서로 같지만 진행하는 시작점이 행이냐 열이냐에 차이이다 그렇기에

일단 행에 대한 연산을 완성하고 그 후 열과 행을 바꿔서 출력해 줄 수 있는 함수를 C연산할 때 추가해 주면

R연산에 사용한 방법으로도 C연산을 돌릴 수 있다

4. R연산할 때 나는 딕셔너리를 이용하여 현재 행에 대해서 원소의 개수값을 카운트하였고 그 후 

(여기 저 주의할 점은 빈 공간일 때 넣어둘값은 카운트하면 안 된다 또한 정렬에도 포함되면 안된다 그렇기에 나는 이 문제 조건에서 나올 수 없는 수를 이용하여 정렬 돌려도 한생 제자리를 유지하도록 만들었다)

딕셔너리. item()을 이용하면 key와 value 값을 튜플로 뭉쳐서 리스트로 만들어

정렬을 하였다 정렬을 할 때에는 람다 정렬을 이용하였는데 개수를 기준으로 먼저 정렬하고 그 후 값에 대해서 정렬한다

 

코드

def transpose(matrix):
    rows = len(matrix)
    cols = len(matrix[0])
    transposed_matrix = [[0 for _ in range(rows)] for _ in range(cols)]
    for i in range(rows):
        for j in range(cols):
            transposed_matrix[j][i] = matrix[i][j]

    return transposed_matrix

def rctranspose(array):
    R = len(array)
    C = len(array[0])
    max_len = 0
    for j in range(R):
        di = {}
        for k in array[j]:
            if k != 1000000000:
                if k in di:
                    di[k] += 1
                else:
                    di[k] = 1
        di_list = list(di.items())
        di_list.sort(key=lambda x: (x[1], x[0]))
        array[j] = []
        for x, y in di_list:
            array[j].append(x)
            array[j].append(y)
            if max_len < len(array[j]):
                max_len = len(array[j])
    for k in range(R):
        if max_len > len(array[k]):
            for t in range(max_len - len(array[k])):
                array[k].append(1000000000)

    return array


r, c, kk = map(int, input().split())
array = [list(map(int, input().split())) for _ in range(3)]
R = len(array)
C = len(array[0])

if R >= r and C >= c and array[r - 1][c - 1] == kk:
    print(0)

else:
    for i in range(100):
        R = len(array)
        C = len(array[0])

        if R >= C:

            array=rctranspose(array)
        else:
            array = transpose(array)

            array=rctranspose(array)

            array = transpose(array)

        R = len(array)
        C = len(array[0])

        if R > 100:
            array = array[:100]
        if C > 100:
            array = transpose(array)
            array = array[:100]
            array = transpose(array)
        if R >= r and C >= c:
            if array[r - 1][c - 1] == kk:
                print(i + 1)
                break
        if i == 99:
            print(-1)
반응형