본문 바로가기

알고리즘/백준

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

728x90

17140번: 이차원 배열과 연산

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

🤔 문제분석

배열의 구조를 잘 파악하고 있다면 쉽게 문제를 해결 할 수 있습니다. 임시의 딕셔너리를 만들어 가중치를 담아내고 딕셔너리를 순회하여 다시 배열을 만든다음, 해당 배열을 정렬한뒤 새로운 행렬을 만들어 내었습니다.

R연산은 기본적으로 배열을 순회하는 방식이 똑같기때문에 최대길이를 구한뒤, 그 최대 길이만큼 도달하지 못한 행은 0을 뒤에 최대길이 만큼 추가해주었습니다.

C연산은 순회하는 방식이 날라서 최대길이의 배열을 생성한뒤(0으로 초기화)에, i과 j를 뒤집어서 새로만든 배열에 입력하는 형식으로 문제를 해결 하였습니다.

💻 코드

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

r, c, k = map(int, input().split())
A = []

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

def get_arr_size(A):
    return len(A), len(A[0])

def R(A):
    new_A = []
    max_length = 0
    for i in range(len(A)):
        new_arr = []
        temp = defaultdict(int)
        for j in range(len(A[i])):
            if A[i][j]:
                temp[A[i][j]] += 1
        
        for key in temp:
            new_arr.append((temp[key], key))
        
        new_A.append([])
        new_arr.sort(key=lambda x:(x[0], x[1]))
        for t1, t2 in new_arr:
            new_A[i].append(t2)
            new_A[i].append(t1)
            
        max_length = max(max_length, len(new_A[i]))
    
    for arr in new_A:
        while max_length > len(arr):
            arr.append(0)
    
    return new_A

def C(A):
    new_temp = []
    max_length = 0
    for j in range(len(A[0])):
        new_arr = []
        temp = defaultdict(int)
        for i in range(len(A)):
            if A[i][j]:
                temp[A[i][j]] += 1
        
        for key in temp:
            new_arr.append((temp[key], key))
            
        new_arr.sort(key=lambda x:(x[0], x[1]))
        new_temp.append([])
        for t1, t2 in new_arr:
            new_temp[j].append(t2)
            new_temp[j].append(t1)
        max_length = max(max_length, len(new_temp[j]))
        
    new_A = [[0 for _ in range(len(new_temp))] for _ in range(max_length)]
    for i in range(len(new_temp)):
        for j in range(len(new_temp[i])):
            new_A[j][i] = new_temp[i][j]
    
    return new_A

time = 0
for _ in range(101):
    height, width = get_arr_size(A)
    if height >= r and width >= c:
        if A[r-1][c-1] == k:
            break

    if height >= width:
        A = R(A)
    else:
        A = C(A)
    time += 1

if time == 101:
    print(-1)
else:
    print(time)

🎯 피드백 및 개선사항

베열의 순환 그리고 정렬을 사용하는방법에 대해서 잘 알고 있다면 쉽게 풀 수 있는 문제라고 생각합니다.

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 2109번 : 순회강연  (1) 2024.02.05
[백준] 1377번 : 버블소트  (1) 2024.02.05
[백준] 21609번 : 상어 초등학교  (0) 2024.02.04
[백준] 10800번 : 킬러볼  (0) 2024.02.04
[백준] 4574번 : 스노미노쿠  (0) 2024.02.04