728x90
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 |