본문 바로가기
Coding Test/BOJ

[백준] 17140 - 이차원 배열과 연산 [Python(파이썬)]

'삼성 SW 역량 테스트' 기출 문제 입니다. 😀
문제 👉 17140번: 이차원 배열과 연산

1. 문제

  1. 크기가 3×3인 배열 A가 있다. 1초가 지날때마다 배열에 연산이 적용된다.
    • R 연산: 배열 A의 모든 행에 대해서 정렬을 수행한다. 행의 개수 ≥ 열의 개수인 경우에 적용된다.
    • C 연산: 배열 A의 모든 열에 대해서 정렬을 수행한다. 행의 개수 < 열의 개수인 경우에 적용된다.
  2. 정렬은 수의 등장 횟수가 커지는 순으로, 그러한 것이 여러가지면 수가 커지는 순으로 정렬한다.
  3. 행 또는 열의 크기는 가장 큰 행 또는 열을 기준으로 크기를 정하고, 행 또는 열의 크기가 커진 곳에는 0이 채워진다.
  4. A[r][c]에 들어있는 값이 k가 되기 위한 연산의 최소 시간을 출력한다. 100초가 지나도 A[r][c] = k가 되지 않으면 -1을 출력한다.

2. 풀이

시뮬레이션을 이용한 문제 풀이

  1. Counter를 통해 정수의 빈도수를 구한다.
    • Counter를 구한 정수의 빈도수를 sorted의 lambda를 통해 key와 value 위치를 바꾼다.
    • key 값이 0일 떄는 생략한다.
  2. 행 또는 열의 모든 값을 바꾼 후 최대 길이에 맞게 0을 추가한다.
  3. 열에 대한 연산을 위해 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

  •  

🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다.
잘못된 부분이 있다면 과감하게 지적해주세요!! 🏋

댓글