CS(컴퓨터 사이언스)/알고리즘

[코드트리] 격자 숫자 놀이

커다란송 2024. 6. 9. 17:43
728x90

문제링크

https://www.codetree.ai/training-field/frequent-problems/problems/matrix-number-play/description?page=3&pageSize=20

 

코드트리 | 코딩테스트 준비를 위한 알고리즘 정석

국가대표가 만든 코딩 공부의 가이드북 코딩 왕초보부터 꿈의 직장 코테 합격까지, 국가대표가 엄선한 커리큘럼으로 준비해보세요.

www.codetree.ai

 

numpy를 이용해서 남들과 다르게 풀어보기

그치만 코드 실행하면

 

정상 제출 되지는 않는다는 점!

 

분명 일반 리스트보다 numpy를 이용하면

코드 실행 속도가 빨라서 좋을텐데 🤔🤔

 

※ 사용하고자 하는 리스트의 길이가 짧은 경우
zip함수와 numpy의 transpose에 큰 차이가 없겠지만
그 길이가 길어질수록 numpy의 벡터 연산이 더 빠르다

 

import numpy as np

r,c,k = map(int, input().split())
A = []
for i in range(3):
    A.append(list(map(int, input().split())))

def fill_zero(A, max_len):
    for a in A:
        while len(a) < max_len:
            a.append(0)
    return A

def cal_row(A):
    new_A = []
    for a in A:
        with_cnt = set()
        for i in a:
            if i != 0:
                with_cnt.add((i, a.count(i)))
        sorted_wc = sorted(with_cnt, key=lambda x: (x[1], x[0]))
        ee = []
        for i in sorted_wc:
            ee.append(i[0])
            ee.append(i[1])
        new_A.append(ee)
        max_len = max(map(len, new_A))
    return new_A, max_len


def cal_col(A):
    new_A = np.array(A).T
    new_A = [list(row) for row in new_A]
    new_A, max_len = cal_row(new_A)
    new_A = fill_zero(new_A, max_len)
    new_A = np.array(new_A).T
    new_A = [list(row) for row in new_A]
    max_len = max(map(len, new_A))
    return new_A, max_len

sec = 0
while True:
    # 조건 확인 K
    if r < len(A[0]) and c < len(A):
        if A[r-1][c-1] == k:
            print(sec)
            break
    # 조건 확인 sec
    if sec > 100:
        print(-1)
        break
    # 행 열 길이 비교
    if len(A[0]) <= len(A):
        # 행 연산
        new_A, max_len = cal_row(A)
        # 0 채우기
        A = fill_zero(new_A, max_len)
    else:
        # 열 연산
        new_A, max_len = cal_col(A)
        # 0 채우기
        A = fill_zero(new_A, max_len)
    sec += 1

 

728x90