꾸준하게 거북이처럼

이차원배열과 연산 백준 파이썬 본문

Algorithm 문제 & 공부/구현

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

somm12 2023. 7. 22. 11:17

 

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

구현 시뮬레이션 문제로, 문제 조건을 잘 체크해야한다. 

- 0은 정렬 X,

- 정렬 하는 기준 : 등장 횟수 > 숫자 가 커지는! 순

- 크기가 달라지면 큰 행또는열 기준으로 0을 채워야함

- 행이나 열 크기가 100 넘으면 100x100으로 자르기

이 문제는 아래처럼 파이썬의 zip연산을 이용해서 열 정렬을 쉽게 할 수 있다.

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

풀이

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

def sortMatrix(x): # R / C 연산을 해서. 정렬
    global A
    if x == 'C':
        A = list(zip(*A)) # 열마다 정렬을 쉽게 하기 위해서 zip 연산을 써서 행과 열을 바꿈.
    new = [] # 정렬된 결과를 담을 배열.
    long = -1 # 가장 큰 행/열을 길이를 담을 변수.
    for arr in A:
        tmp = [] # 정렬을 하기위해 임시 저장소로 사용될 변수
        for v in set(arr):
            if v == 0: # 0은 정렬에 포함하지 않음
                continue
            cnt = arr.count(v)
            tmp.append([v,cnt])
        tmp.sort(key = lambda x : (x[1],x[0])) # 횟수가 커지는 순 다음으로 숫자가 커지는 순으로 정렬.
        sortedRow = [] # 각 행이 정렬된 정보를 1차원 배열 형태로 임시 저장될 배열.
        for i in tmp:
            sortedRow += i # [숫자, 개수] 형태로 빈배열에 더해짐.
        new.append(sortedRow)
        long = max(long, len(sortedRow))
    
    for arr in new:
        if len(arr) < long:
            arr += [0]*(long- len(arr)) # 가장 큰 행 기준으로 0을 채우기.
    if x == 'C':
        A = list(zip(*new)) # 다시 원래 형태의 배열로 zip연산해주기.
    else:
        A = new

while True:
    # 배열의 형태가 바뀌기 때문에, A[r][c] 값을 확인시, 범위도 확인.
    if 0<= r < len(A) and 0 <= c < len(A[0]) and A[r][c] == k:
        print(time)
        break
    if time > 100:# 100초 넘어가면 -1 출력.
        print(-1)
        break
    row = len(A)
    col = len(A[0])

    if row >= col: # 행 >= 열이면 R연산
        sortMatrix('R')
    else:
        sortMatrix('C')
    
    if len(A) > 100 or len(A[0]) > 100: # 크기가 100 넘어가면 100x100으로 자르기.
        tmp = []
        for i in range(len(A)):
            if i < 100:
                tmp.append(A[i][:100])
            else:
                break
        A = tmp
    time += 1
Comments