'삼성 SW 역량 테스트' 기출 문제 입니다. 😀
문제 👉 17140번: 이차원 배열과 연산
1. 문제
- 크기가 3×3인 배열 A가 있다. 1초가 지날때마다 배열에 연산이 적용된다.
- R 연산: 배열 A의 모든 행에 대해서 정렬을 수행한다. 행의 개수 ≥ 열의 개수인 경우에 적용된다.
- C 연산: 배열 A의 모든 열에 대해서 정렬을 수행한다. 행의 개수 < 열의 개수인 경우에 적용된다.
- 정렬은 수의 등장 횟수가 커지는 순으로, 그러한 것이 여러가지면 수가 커지는 순으로 정렬한다.
- 행 또는 열의 크기는 가장 큰 행 또는 열을 기준으로 크기를 정하고, 행 또는 열의 크기가 커진 곳에는 0이 채워진다.
- A[r][c]에 들어있는 값이 k가 되기 위한 연산의 최소 시간을 출력한다. 100초가 지나도 A[r][c] = k가 되지 않으면 -1을 출력한다.
2. 풀이
시뮬레이션
을 이용한 문제 풀이
Counter
를 통해 정수의 빈도수를 구한다.Counter
를 구한 정수의 빈도수를 sorted의 lambda를 통해 key와 value 위치를 바꾼다.- key 값이 0일 떄는 생략한다.
- 행 또는 열의 모든 값을 바꾼 후 최대 길이에 맞게 0을 추가한다.
- 열에 대한 연산을 위해 zip을 이용해 transpose한다.
3. 코드
from collections import Counter
r, c, k = map(int, input().split())
A = [list(map(int, input().split())) for _ in range(3)]
def solution():
global A, k, r, c
ret = 0
while ret <= 100:
row, col = len(A), len(A[0])
if row >= r and col >= c:
if A[r-1][c-1] == k:
return ret
if row >= col:
arr = [[] for _ in range(row)]
maxlen = 0
for i in range(row):
for key, value in sorted(Counter(A[i]).items(), key = (lambda x: (x[1], x[0]))): # Counting 후 key,value 위치 변경
if key == 0:
continue
arr[i].extend([key, value])
maxlen = max(maxlen, len(arr[i]))
for i in range(row):
leng = maxlen - len(arr[i])
arr[i].extend([0]*leng)
else:
arr = [[] for _ in range(col)]
maxlen = 0
A = [list(x) for x in zip(*A)] # transpose
for i in range(col):
for key, value in sorted(Counter(A[i]).items(), key = (lambda x: (x[1], x[0]))):
if key == 0:
continue
arr[i].extend([key, value])
maxlen = max(maxlen, len(arr[i]))
for i in range(col):
leng = maxlen - len(arr[i])
arr[i].extend([0]*leng)
arr = [list(x) for x in zip(*arr)]
A = arr[:]
ret += 1
return -1
print(solution())
- 결과 : 108 ms
References
🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋
'Coding Test > BOJ' 카테고리의 다른 글
[백준] 17141 - 연구소 2 [Python(파이썬)] (0) | 2021.11.22 |
---|---|
[백준] 16236 - 아기 상어 [Python(파이썬)] (0) | 2021.11.22 |
[백준] 16235 - 나무 재테크 [Python(파이썬)] (0) | 2021.11.22 |
댓글