[BOJ 17140] 이차원 배열과 연산

짱J·2023년 1월 16일
0
post-thumbnail

백준 17140번 이차원 배열과 연산 풀러가기

1️⃣ 문제 설명

이번에는 문제가 길어서 직접 정리를 해보았다.

2️⃣ 문제를 풀기 위해 사용된 파이썬 문법들

Counter 클래스의 most_common 함수를 이용한 빈도수 정렬

from collections import Counter

a = [1, 2, 1]
Counter(a).most_common() # [(1, 2), (2, 1)]
  • 데이터의 개수가 많은 순으로 정렬된 배열을 반환

zip 함수를 이용한 transponse 구현

A = [[1,2,3],[4,5,6]]
list(zip(*A)) # [(1, 4), (2, 5), (3, 6)]

3️⃣ 전체 코드

import sys
from collections import Counter

input = sys.stdin.readline

# 입력
r, c, k = map(int, input().split())

A = []
for _ in range(3):
    A.append(list(map(int, input().split())))

def rc():
    max_len = 0
    for j in range(len(A)):
        a = [i for i in A[j] if i!= 0] # 정렬할 때 0은 무시
        a = Counter(a).most_common() # 수의 등장 횟수를 기준으로 정렬
        a.sort(key = lambda x: (x[1], x[0])) # 오름차순으로 정렬

        A[j] = [] # 새로운 배열을 선언하지 않고 A 배열을 재활용
        
        # 튜플로 이루어진 a를 1차원 배열로 만듦
        for key, value in a:
            A[j].append(key)
            A[j].append(value)
        
        # 길이는 최대 (수의 개수) * 2만큼 늘어날 수 있음
        if max_len < len(a) * 2:
            max_len = len(a) * 2

    for j in range(len(A)):
    	# 빈 칸은 0으로 채움
        for k in range(max_len - len(A[j])):
            A[j].append(0)
        # 처음 100개만 고려
        A[j] = A[j][:100]

for i in range(101):
    try:
        if A[r-1][c-1]==k:
            print(i)
            break
    except:
        pass
    
    # 행 개수 < 열 개수 → C 연산
    if len(A) < len(A[0]):
    	# transponse하여 정렬하고 다시 transponse
        A = list(zip(*A))
        rc()
        A = list(zip(*A))
    # 행 개수 >= 열 개수 → R 연산
    else:
        rc()

# 100초가 지나도 A[r][c] == k가 아니면 -1을 출력
else:
    print(-1)
profile
[~2023.04] 블로그 이전했습니다 ㅎㅎ https://leeeeeyeon-dev.tistory.com/

0개의 댓글