문제
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)
총평
으어어...삼성 벼락치기 힘들다...
'알고리즘 > 삼성 기출' 카테고리의 다른 글
연구소 3 [백준 17142번] (0) | 2022.10.08 |
---|---|
마법사 상어와 파이어볼 [백준 20056번] (0) | 2022.10.07 |
미세먼지 안녕! [백준 17144번] (0) | 2022.10.06 |
드래곤 커브 [백준 15685번] (0) | 2022.10.06 |
감시 [백준 15683번] (0) | 2022.10.05 |