문자열 더하기 실행 시간 주의

박진은·2023년 3월 14일
0

코테

목록 보기
15/44
def solution(X, Y):
    string = ["0","1","2","3","4","5","6","7","8","9"]
    answer = ''

    x_dict = {str(i) : 0 for i in range(0,10)}
    y_dict = {str(i) : 0 for i in range(0,10)}
    
    for i in X:
        x_dict[i] +=1
    for e in Y:
        y_dict[e] += 1
    
    
    count = 0
    buf_dict = {x : 0 for x in string}
    for i in string:
        if x_dict[i] !=0 and y_dict[i]!=0:
            count +=1
            if x_dict[i] >= y_dict[i]:
                buf_dict[i] = y_dict[i]
            else:
                buf_dict[i] = x_dict[i]
                         
    if count == 0:
        return "-1"
                      
    sum = 0
    for i in range(1,10):
        sum += buf_dict[string[i]]
        
    if sum == 0:
        return "0"
    
    index = 0
    for e in string:
        answer = e*buf_dict[e] + answer 
            
    return answer

일단 내가 푼 코드는 다음과 같다. 문제는 파라미터로 주어진 X,Y에서 공통된 자리수를 골라서 붙여서 가장 큰 숫자를 만들어야했다. 초기의 코드를 보면 간단한 로직 이지만 연산은 복잡했다. 겹치는 숫자를 모드 리스트에 넣고 이를 정렬해서 이어 붙여서 만드는 방식을 취했다. 하지만 이렇게 리스트로 구현하면 불필요한 메모리의 낭비가 극심해서 런타임 오류가 발생했다.

이후 생각한 것이 딕셔너리를 만드는 방법이었다. 어차피 숫자는 0~9까지 밖에 존재하지 않은니까 이를 이용해서 딕셔너리에 갯수를 삽입하면 훨씬 간단하게 구현이 가능했다. 즉 각 자리수의 숫자에 갯수를 세고 더 적은 숫자가 겹치는 숫자임을 감안하면 훨씬 연산을 줄일 수 있었다. 하지만 이러한 방법을 사용해서 계속해서 실행시간 초과 오류가 발생했다.
그 이유는 숫자 하나하나를 answer에 더하는 방식으로 여러번의 연산 횟수를 거쳤다. 하지만 파이선 * 연산을 통해서 한번에 큰 문자열을 생성하고 더하는 연산을 줄여서 런타임을 줄일 수 있었다... 파이선 스럽게 코딩한다는게 진짜 어려운거 같다.

profile
코딩

0개의 댓글