본문 바로가기
Algorithm

[Programmers] 131128.py 숫자 짝꿍

by roses16 2023. 7. 11.

문제 그대로 풀었으나 시간 초과로 실패!

def solution(X, Y):
    arr_z = []
    arr_x = sorted(list(X), reverse=True)
    arr_y = list(Y)

    for num in arr_x:
        if num in arr_y:
            arr_z.append(num)
            arr_y.remove(num)
    
    return str(int(''.join(arr_z))) if len(arr_z) else "-1"

 

arr_x를 정렬하는 대신 필터링이 끝난 arr_z를 정렬해서 약 50%로 시간이 감소되었으나 여전히 시간 초과 실패했다.

위 코드와 거의 비슷해서 코드 첨부는 생략.


dictionary 형식으로 구조를 만들면 반복 횟수를 10회로 고정해서 풀 수 있겠다 생각해서 아래와 같이 해결.

 

def solution(X, Y):
    arr_z = []
    answer = []

    for num in range(9, -1, -1):
        count_x = X.count(num)
        count_y = Y.count(num)

        arr_z.append((num, min(count_y, count_x))

    for num in arr_z:
        answer += [num[0]] * num[1]

    if len(answer) == 0:
        return "-1"
    
    if len(answer) == answer.count("0"):
        return "0"
    
    return ''.join(answer)

 

반복문을 2개로 나누어서 사용했는데 굳이 나눌 필요 없어 보여서 아래와 같이 코드 정리.

정리하다보니 굳이 배열을 사용할 필요도 없어보여서 한줄로 정리

 

def solution(X, Y):
    answer = ''

    for num in range(9, -1, -1):
        answer += str(num) * min(X.count(str(num)), Y.count(str(num)))

    if len(answer) == 0:
        return "-1"
    
    if len(answer) == answer.count("0"):
        return "0"
    
    return answer

 

5번째 행에서 한 문장에 형변환이 3번이나 실행되는 점이 마음에 걸려서 반복문을 ['9', '8', ...] 와 같이 아예 string 배열로 돌렸는데 속도면에서 큰 차이가 없었다.