PS/Python

[백준] 17140 - 이차원 배열과 연산(파이썬, Python)

w00se 2021. 5. 19. 19:01

https://pixabay.com/ko/photos/우산-햇빛-여자-비-빛-6239364/

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

 

해당 문제는 조건에 따라 각 행 또는 열에 연산을 반복하면서 주어진 위치에 지정한 값이 있는지 확인하는 문제입니다.

 

저는 이 문제를 풀 때 각 행과 열의 최대 길이가 100이 된다는 것에 집중했습니다.

처음부터 100 X 100 크기의 배열을 이용해서 작업을 했습니다.(행과 열의 길이를 맞추는 작업을 간단히 하기 위해 위와 같이 했지만 이것 때문에 속도가 느려진 게 아닌가 생각이 듭니다.)

 

이 문제에 대한 제 접근법은 아래와 같습니다.

 

접근법

1. 처음 입력되는 r, c를 각각 -1 해서 저장(목표 지점이 되는 행과 열의 위치를 인덱스 번호와 일치시키기 위해 수행했습니다.)

2. 입력 값을 100 X 100 크기의 배열에 저장

3. 조건에 따라 행과 열에 대해 연산 수행

3.1 만약 행의 수 >= 열의 수 라면 R연산 수행

3.2 만약 행의 수 < 열의 수 라면 C연산 수행

3.3 각 행(또는 열)에 연산이 수행된 후 길이를 100으로 맞추기

4. 연산 수행 후 목표 위치에 주어진 값이 있는 지 확인

 

전체 코드는 아래와 같습니다.

 

전체 코드

import sys
from collections import Counter

r, c, k = map(int, sys.stdin.readline().strip().split())
r, c = r-1, c-1

mat = [ list(map(int, sys.stdin.readline().strip().split()))+[0]*97 for _ in range(3) ]

mat = mat + [[0]*100 for _ in range(97)]

maxR = 3
maxC = 3
answer = -1
time = 0


if mat[r][c] == k:
    answer = 0
    time = 101

while time < 100:
    time += 1

    if maxR >= maxC:
        # R연산 수행
        tempMaxC = 0

        for row in range(maxR):
            temp = [e for arr in sorted(Counter(mat[row]).items(), key=lambda x: (x[1], x[0])) for e in arr if arr[0] != 0]
            
            if tempMaxC < len(temp):
                tempMaxC = len(temp)

            if len(temp) < 100:
                temp += [0] * (100 - len(temp))
            else:
                temp = temp[:100]
            
            mat[row] = temp
        
        maxC = tempMaxC

    else:
        # C연산 수행
        tempMaxR = 0

        for col in range(maxC):
            temp = [e for arr in sorted(Counter([mat[row][col] for row in range(maxR)]).items(), key=lambda x: (x[1], x[0])) for e in arr if arr[0] != 0]

            if tempMaxR < len(temp):
                tempMaxR = len(temp)

            if len(temp) < 100:
                temp += [0] * (100 - len(temp))
            else:
                temp = temp[:100]
    
            for row in range(len(temp)):
                mat[row][col] = temp[row]
        
        maxR = tempMaxR

    # 목표 위치에 숫자를 확인하기
    if mat[r][c] == k:
        answer = time
        break
    
print(answer)