[백준 삼성기출 X] 이차원 배열과 연산(python)

이진규·2022년 9월 7일
1

백준(PYTHON)

목록 보기
104/115

문제

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

나의 코드

"""

"""

from collections import Counter
from sys import stdin
input = stdin.readline

"""
1. C연산은 배열 A를 transpose한 뒤 R연산을 하고 다시 transpose를 한 결과와 같다. 
-> transpose 과정에서 시간이 걸리긴함
2. Counter를 통해서 각 요소의 개수를 확인했음 결과는 dictionary 형태
3. dictionary를 정렬을 하는데 우선순위는 value, key순으로 정렬
4. 최대 길이를 가지는 행(max_len)을 기준으로 0을 채워넣음
"""

r, c, k = map(int, input().split())
A = [ list(map(int, input().split())) for _ in range(3) ]
time = 0

def R():
    copy_a = []
    max_len = 0

    for tmp in A:
        tmp = Counter(tmp) # 숫자와 개수 세기
        del tmp[0] # 수를 정렬할 때 0은 무시한다고 문제에 나와 있음
        copy_tmp = sorted(tmp.items(), key=lambda x : (x[1], x[0])) # value, key 순서로 정렬

        tt = []
        for a in copy_tmp: # 정렬된 배열을 옮겨 담는데 길이가 100이 넘어가면 그만 옮김
            tt.extend(a)
            if len(tt) == 100: break
        max_len = max(max_len, len(tt))
        copy_a.append(tt)

    for ss in copy_a:
        ss += [0] * (max_len - len(ss)) # 행의 크기가 커진 곳에 0을 채움

    return copy_a

while True:

    if time > 100:
        break
    if r <= len(A) and c <= len(A[0]) and A[r-1][c-1] == k:
        break

    if len(A) >= len(A[0]):
        A = R()
    else:
        A = list(zip(*A)) # zip()을 이용해 transpose 해줌
        A = R()
        A = list(zip(*A)) # 다시 zip()을 이용해 transpose 해줌

    time += 1

print(-1 if time > 100 else time)
    

설명

Counter() 함수 : Counter 생성자에 문자열을 인자로 넘기면 각 문자가 문자열에서 몇 번씩 나타나는지를 알려주는 객체가 반환됩니다.

zip() 함수 : 길이가 같은 리스트의 요소를 묶어주는 함수

extend() 함수 : iterable의 모든 아이템을 리스트에 추가합니다. iterable이기 때문에 list, tuple 모두 가능합니다.

골고루 활용할 수 있어야 하는 문제

참고 자료

문제 : https://landlordgang.tistory.com/55

Counter() : https://www.daleseo.com/python-collections-counter/

zip() : https://ooyoung.tistory.com/60

extend() + append(),insert() : https://codechacha.com/ko/python-append-vs-extend/

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글