17140: 이차원 배열과 연산

ewillwin·2023년 7월 7일
0

Problem Solving (BOJ)

목록 보기
110/230

구현 방식

  • 그냥 R연산과 C연산을 나누어 빡구현함
  • dictionary sorting
    -> value값을 오름차순, 그러한 것이 여러가지면 key값 오름차순 정렬은 아래와 같이 한다

    sorted_cnt = sorted(cnt.items(), key=lambda x: (x[1], x[0]))

  • R연산은 final 리스트를 만들 때 result 리스트의 원소를 extend 해주고, max_len - len(tmp)만큼 0으로 padding
  • C연산은 미리 final 리스트의 공간을 할당해 놓고(값은 0으로 채움) final[j*2+k][i] = result[i][j][k] 이런식으로 값을 넣어줌

추가 사항

  • python에서 2차원 list를 Transpose 하는 법

    list(map(list, zip(*A)))

  • 구글링 해보니까 이런 방식도 있었음/ python 내장 함수임
import sys

def cal_R():
    max_len = 0; result = []
    for i in range(len(A)):
        cnt = dict()
        for j in range(len(A[i])):
            if A[i][j] != 0:
                if A[i][j] in cnt:
                    cnt[A[i][j]] += 1
                else:
                    cnt[A[i][j]] = 1
        sorted_cnt = sorted(cnt.items(), key=lambda x: (x[1], x[0]))
        if len(sorted_cnt) * 2 > 100:
            sorted_cnt = sorted_cnt[:50]
        max_len = max(max_len, len(sorted_cnt) * 2)
        result.append(sorted_cnt)
    
    final = []
    for i in range(len(result)):
        tmp = []
        for j in range(len(result[i])):
            tmp.extend(result[i][j])
        for j in range(max_len - len(tmp)):
            tmp.append(0)
        final.append(tmp)
    return final

def cal_C():
    max_len = 0; result = []
    for j in range(len(A[0])):
        cnt = dict()
        for i in range(len(A)):
            if A[i][j] != 0:
                if A[i][j] in cnt:
                    cnt[A[i][j]] += 1
                else:
                    cnt[A[i][j]] = 1
        sorted_cnt = sorted(cnt.items(), key=lambda x: (x[1], x[0]))
        if len(sorted_cnt) * 2 > 100:
            sorted_cnt = sorted_cnt[:50]
        max_len = max(max_len, len(sorted_cnt) * 2)
        result.append(sorted_cnt)    
    
    final = [[0] * len(A[0]) for _ in range(max_len)]
    for i in range(len(result)):
        tmp = []
        for j in range(len(result[i])):
            for k in range(len(result[i][j])):
                final[j*2 + k][i] = result[i][j][k]
    return final



r, c, k = map(int, sys.stdin.readline()[:-1].split())
A = []
for _ in range(3):
    A.append(list(map(int, sys.stdin.readline()[:-1].split())))

# A = cal_R()
# print(A)
# A = cal_R()
# print(A)
# # A = cal_C()
# # print(A)

result_cnt = 0
while True:
    if len(A) >= r and len(A[0]) >= c:
        if A[r-1][c-1] == k:
            break
    result_cnt += 1
    if result_cnt > 100:
        result_cnt = -1; break
    if len(A) >= len(A[0]):
        A = cal_R()
    else:
        A = cal_C()

print(result_cnt)
profile
💼 Software Engineer @ LG Electronics | 🎓 SungKyunKwan Univ. CSE

0개의 댓글