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

이민우·2023년 12월 26일
1

알고리즘

목록 보기
20/26

문제 보러 가기

문제 풀이

  • 해당 문제는 간단하다.
  • 배열 A에서 행의 갯수가 >= 열의 갯수보다 많으면 -> R연산()
    • [3,1,1] ->(R연산 수행) [3,1,1,2]
  • A에서 열의 갯수가 >= 행의 갯수보다 많으면 -> C연산()
  • 해당 수와 등장 횟수를 모두 넣어 정렬을 실행할 때, 체크할 check 배열을 생성후 탐색을 하면 된다.
  • 해당 문제에서 중요한점은, 행<->열 변환후 가장 큰 행or열의 길이로 만들고 이 보다 짧은 행, 열이 존재할 경우 0을 채워 주는 것이다.
		 line_len=len(a)
        row_len=len(a[0])
        if line_len>=row_len:
            a=line(a)
        else:
            a=list(map(list, zip(*a)))
            a=line(a)
            a=list(map(list, zip(*a)))

여기서 list(map(list, zip(*a))) 이줄은 열을 행으로 변환해준다. 변환후 line() 함수에서 정렬을 수행한 후에는 다시 a=list(map(list, zip(*a)))를 해줘야 된다.

   result=[]
    for i in a:
        new_a=[]
        for j in i:
            new_a.extend(j)
        if len(new_a)<max_tmp:
            new_a.extend([0]* (max_tmp-len(new_a)))
        result.append(new_a)

이 코드는 max_tmp라는 변수에 가장 큰 행 or 열의 길이를 저장 후에, 이보다 짧은 길이를 가진 행 or 열에 부족한 길이 만큼 0을 추가하는 것이다

⭐️ 전체 코드

import sys
input=sys.stdin.readline
def line(a):
    max_tmp=0
    for i in range(len(a)):
        check=[0]*101
        tmp=[]
        for j in a[i]:
            check[j]+=1
        for k in range(1, 101):
            if check[k]!=0:
                tmp.append((k, check[k]))
        tmp.sort(key=lambda x:(x[1], x[0])) ## 수의 등장 횟수를 우선 기준으로 정렬
        max_tmp=max(max_tmp, len(tmp))
    
        a[i]=tmp
    max_tmp*=2
    result=[]
    for i in a:
        new_a=[]
        for j in i:
            new_a.extend(j)
        if len(new_a)<max_tmp:
            new_a.extend([0]* (max_tmp-len(new_a)))
        result.append(new_a)
    return result

    
r,c,k=map(int, input().split())
a=[list(map(int, input().split())) for _ in range(3)]
cnt=0
while True:
    if len(a)>=r and len(a[0])>=c and a[r-1][c-1]==k:
            print(cnt) 
            break
    elif cnt>100:
        print(-1)
        break
    else:
        cnt+=1
        ## 행의 갯수

        line_len=len(a)
        row_len=len(a[0])
        if line_len>=row_len:
            a=line(a)
        else:
            a=list(map(list, zip(*a)))
            a=line(a)
            a=list(map(list, zip(*a)))

profile
백엔드 공부중입니다!

0개의 댓글