Notice
Recent Posts
Recent Comments
Link
꾸준하게 거북이처럼
이차원배열과 연산 백준 파이썬 본문
17140번: 이차원 배열과 연산
첫째 줄에 r, c, k가 주어진다. (1 ≤ r, c, k ≤ 100) 둘째 줄부터 3개의 줄에 배열 A에 들어있는 수가 주어진다. 배열 A에 들어있는 수는 100보다 작거나 같은 자연수이다.
www.acmicpc.net
구현 시뮬레이션 문제로, 문제 조건을 잘 체크해야한다.
- 0은 정렬 X,
- 정렬 하는 기준 : 등장 횟수 > 숫자 가 커지는! 순
- 크기가 달라지면 큰 행또는열 기준으로 0을 채워야함
- 행이나 열 크기가 100 넘으면 100x100으로 자르기
이 문제는 아래처럼 파이썬의 zip연산을 이용해서 열 정렬을 쉽게 할 수 있다.
a = [[1,2,3], [4,5,6]]
a = list(zip(*a))
print(a) # [(1,4) ,(2,5), (3,6)]
풀이
r,c,k = map(int,input().split())
A= []
for _ in range(3):
A.append(list(map(int,input().split())))
time =0
r -= 1
c -= 1
def sortMatrix(x): # R / C 연산을 해서. 정렬
global A
if x == 'C':
A = list(zip(*A)) # 열마다 정렬을 쉽게 하기 위해서 zip 연산을 써서 행과 열을 바꿈.
new = [] # 정렬된 결과를 담을 배열.
long = -1 # 가장 큰 행/열을 길이를 담을 변수.
for arr in A:
tmp = [] # 정렬을 하기위해 임시 저장소로 사용될 변수
for v in set(arr):
if v == 0: # 0은 정렬에 포함하지 않음
continue
cnt = arr.count(v)
tmp.append([v,cnt])
tmp.sort(key = lambda x : (x[1],x[0])) # 횟수가 커지는 순 다음으로 숫자가 커지는 순으로 정렬.
sortedRow = [] # 각 행이 정렬된 정보를 1차원 배열 형태로 임시 저장될 배열.
for i in tmp:
sortedRow += i # [숫자, 개수] 형태로 빈배열에 더해짐.
new.append(sortedRow)
long = max(long, len(sortedRow))
for arr in new:
if len(arr) < long:
arr += [0]*(long- len(arr)) # 가장 큰 행 기준으로 0을 채우기.
if x == 'C':
A = list(zip(*new)) # 다시 원래 형태의 배열로 zip연산해주기.
else:
A = new
while True:
# 배열의 형태가 바뀌기 때문에, A[r][c] 값을 확인시, 범위도 확인.
if 0<= r < len(A) and 0 <= c < len(A[0]) and A[r][c] == k:
print(time)
break
if time > 100:# 100초 넘어가면 -1 출력.
print(-1)
break
row = len(A)
col = len(A[0])
if row >= col: # 행 >= 열이면 R연산
sortMatrix('R')
else:
sortMatrix('C')
if len(A) > 100 or len(A[0]) > 100: # 크기가 100 넘어가면 100x100으로 자르기.
tmp = []
for i in range(len(A)):
if i < 100:
tmp.append(A[i][:100])
else:
break
A = tmp
time += 1
'Algorithm 문제 & 공부 > 구현' 카테고리의 다른 글
백준 마법사상어와 파이어볼 파이썬 (0) | 2023.07.30 |
---|---|
혼자 놀기의 달인 프로그래머스 - Python (0) | 2023.04.17 |
백준 12933번 파이썬 - 오리문제 (0) | 2022.10.01 |
백준 1018.py 체스판 칠하기 (0) | 2022.07.07 |
백준 2231번 - 분해합 : 브루트 포스 알고리즘 (0) | 2022.07.07 |
Comments