https://www.acmicpc.net/problem/17140
17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
백준 - 이차원 배열과 연산 (17140번)
난이도 : Gold 4
알고리즘 : Simulation
풀이 소요 시간 : 60분
import sys
input = sys.stdin.readline
def main(r, c, k):
A = [list(map(int, input().split())) for _ in range(3)]
r -= 1; c -= 1
cnt = 0
while len(A) <= r or len(A[0]) <= c or A[r][c] != k:
if r < len(A) and c < len(A[0]) and A[r][c] == k:
return cnt
cnt += 1
if cnt == 101:
return -1
if len(A[0]) <= len(A):
max_len = 0
for i in range(len(A)):
counter = {}
for v in A[i]:
if not v: continue
counter[v] = counter.get(v, 0) + 1
row = sorted([[v, c] for v, c in counter.items()], key=lambda x: (x[1], x[0]))
A[i] = []
for rr in row[:50]:
A[i].extend(rr)
max_len = max(max_len, len(A[i]))
for i in range(len(A)):
A[i].extend([0] * (max_len - len(A[i])))
else:
B = []
max_len = 0
for col in zip(*A):
counter = {}
for v in col:
if not v: continue
counter[v] = counter.get(v, 0) + 1
row = sorted([[v, c] for v, c in counter.items()], key=lambda x: (x[1], x[0]))
B.append([])
for rr in row[:50]:
B[-1].extend(rr)
max_len = max(max_len, len(B[-1]))
for i in range(len(A[0])):
B[i].extend([0] * (max_len - len(B[i])))
A = [list(row) for row in zip(*B)]
return cnt
if __name__ == '__main__':
cnt = main(*map(int, input().split()))
print(cnt)
dictionary와 list 처리가 꽤 까다로운 구현 문제였다.
행 길이 맞추기와 0 값 처리에 시간이 좀 걸렸다.
그리고 행 작업보다 열 작업을 구현하는게 좀 더 까다로웠다.
효율적이고 깔끔한 코드는 아닌 것 같지만
k가 100으로 제한되어 있어, 시간 초과 없이 통과한 것 같다.
'Algorithm' 카테고리의 다른 글
RGB거리 2 (17404번) - 백준 (BOJ) (0) | 2023.04.24 |
---|---|
마법사 상어와 비바라기 (21610번) - 백준 (BOJ) (0) | 2023.04.24 |
동전 1 (2293번) - 백준 (BOJ) (0) | 2023.04.24 |
1, 2, 3 더하기 4 (15989번) - 백준 (BOJ) (0) | 2023.04.24 |
등대 (133500번) - 프로그래머스 (Programmers) (0) | 2023.04.24 |