본문 바로가기

알고리즘/삼성 기출

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

문제

 

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

 

17140번: 이차원 배열과 연산

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

www.acmicpc.net

 

내 풀이

 

원래 C 연산을 따로 구현하였으나, list(zip(*arr))을 사용하면 전치가 된다는 것을 배우고, R 연산만으로 해결하였다.

 

R을 열심히 구현하였다.

배열의 한 행씩 받아서 각 숫자가 몇 개 있는지 구한 후 튜플을 사용하여 저장하였다. 그리고 sort로 정렬하였다.

만약 한 행의 길이가 100보다 길면 잘라내었고, max_len도 100으로 갱신하였다.

그렇게 새로운 A인 new_A를 만들었다.

 

그리고 메인 함수를 만들 때 왠지 재귀를 사용하고 싶었다. (나는 언제부터 재귀의 노예가 되었는가)

그래서 재귀를 사용하여 조건에 따라 R연산과 C연산을 적용하였다.

 

import copy
from collections import Counter

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

def R(tmp):
    new_A = []
    max_len = 0
    for arr in tmp:
        n_arr = []
        dic = dict(Counter(arr))
        for d in dic:
            n_arr.append((d, dic[d]))
        n_arr.sort(key=lambda x: (x[1], x[0]))
        nn_arr = []
        for x1, x2 in n_arr:
            if x1 != 0:
                nn_arr.extend([x1, x2])
                max_len = max(max_len, len(nn_arr))
                if max_len > 100: max_len = 100
        new_A.append(nn_arr)
    for arr in new_A:
        if len(arr) < max_len:
            arr.extend([0]*(max_len-len(arr)))
        if len(arr) > 100:
            arr = arr[:101]
    return new_A

def dfs(t, a):
    tmp = copy.deepcopy(a)
    if t > 100:
        print(-1)
        return
    if r-1 < len(a) and c-1 < len(a[0]) and a[r-1][c-1] == k:
        print(t)
        return
    if len(a) >= len(a[0]):
        dfs(t+1, R(tmp))
    else:
        dfs(t+1, list(zip(*R(list(zip(*tmp))))))
    tmp = copy.deepcopy(a)
dfs(0, A)

 

총평

으어어...삼성 벼락치기 힘들다...