-
백준 17140) 이차원 배열과 연산 (골드.4)알고리즘 2022. 8. 2. 18:34
https://www.acmicpc.net/problem/17140
17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
문제의 조건에 따라 구현하는 시뮬레이션 문제이다. 조건을 확인하면 다음과 같다.
1) 행의 갯수가 열의 갯수보다 많거나 같으면 R연산을 시행하고 그렇지 않으면 C연산을 실행한다.
2) 연산은 행 및 열의 원소와 원소의 갯수를 나타내고 가장 긴 행이나 열보다 작으면 0으로 채워주는 것을 말한다.
3) 만약 행이나 열이 100보다 크면 100 이상의 열이나 행은 자른다.
4) 한번의 연산은 1초의 시간이 걸리고 A[r][c] 가 k가 될때까지 연산이 실행된다.
R연산이 이루어질 때에는 행과 열을 바꿀 필요가 없지만, C연산이 이루어질때에는 행과 열이 바뀌므로 다시 바꿔줄 때 zip을 이용하도록 하였다.
또 여기서 주의할 점은 처음 r, c가 주어질 때 배열의 시작부분이 1이라고 생각하고 주어지기 때문에 각각 -1을 해주어야 하고,
연산이 이루어질 때 행과 열의 길이가 r, c 보다 작아질 수 있기 때문에 행과 열 길이가 r, c 보다 클때 값을 찾아야한다는 것이다.
import sys r, c, k = map(int, sys.stdin.readline().split()) r-= 1 c-=1 graph = [] for i in range(3): graph.append(list(map(int, sys.stdin.readline().split()))) cnt = 0 def sort_graph(a) : l = [] for i in set(a) : if i == 0 : continue l.append((i, a.count(i))) l = sorted(l, key = lambda x: (x[1], x[0])) result = [] for j in l : result.append(j[0]) result.append(j[1]) return result while True : if cnt > 100 : cnt = -1 break if 0<=r<len(graph) and 0<=c<len(graph[0]) and graph[r][c] == k : break maximum = 0 if len(graph)>= len(graph[0]) : for i in range(len(graph)) : graph[i] = sort_graph(graph[i]) maximum = max(maximum, len(graph[i])) for i in range(len(graph)) : if len(graph[i])<maximum : while len(graph[i])< maximum : graph[i].append(0) for i in range(len(graph)) : if len(graph[i])>100 : graph[i] = graph[i][:100] else : new_graph= [] for j in range(len(graph[0])): l = [] for i in range(len(graph)): l.append(graph[i][j]) new_graph.append(sort_graph(l)) maximum = max(maximum, len(new_graph[j])) for i in range(len(new_graph)) : if len(new_graph[i])<maximum : while len(new_graph[i])< maximum : new_graph[i].append(0) for i in range(len(new_graph)) : if len(new_graph[i])>100 : new_graph[i] = new_graph[i][:100] graph = list(zip(*new_graph)) cnt += 1 print(cnt)
'알고리즘' 카테고리의 다른 글
백준 16234) 인구이동 (골드.5) (0) 2022.08.02 백준 15686) 치킨배달 (골드.5) (0) 2022.08.02 백준 12865) 평범한 배낭 (골드.5) (0) 2022.07.20 백준 11054) 가장 긴 바이토닉 부분 수열 (0) 2022.07.20 알고스팟 : 울타리 잘라내기 (분할정복) (0) 2022.07.04