최대 1 분 소요

https://school.programmers.co.kr/learn/courses/30/lessons/131128

.

처음 문제를 읽었을 때, 그냥 중복되는 숫자 골라서 내림차순으로 정렬해버리면 되겠다 했는데, 실제로 구현하려니까 생각보다 복잡했다. set을 쓰려니까 “552”가 출력돼야 하는데 중복된 5가 사라져 “52”로 출력되고, counter를 사용하니 시간초과가 떴다.

처음 풀이(Counter, 시간초과)

from collections import Counter

def solution(X, Y):
    counter_x = Counter(X)
    counter_y = Counter(Y)
    
    common_elements = list((counter_x & counter_y).elements())
    common_elements.sort(reverse = True)
    result = ''.join(common_elements)
    
    if result == '' : result = '-1'
    
    result = str(int(result))
    
    return result

테스트 케이스 11~15에서 시간초과로 걸렸다.

두번째 풀이

def solution(X, Y):
    answer = []
    
    for i in (set(X) & set(Y)) :
        # set()으로 중복이 제거됐으므로 중복된 횟수만큼 for문을 한번 더 돌린다.
        for j in range(min(X.count(i), Y.count(i))) :
            answer.append(i)
    answer.sort(reverse = True)
    
    if len(answer) == 0 :
        answer = "-1"
    
    # 내림차순 정렬했으므로 첫번째 숫자가 0이면 나머지 모두 0
    if answer[0] == "0" :
        answer = "0"
        
    answer = "".join(answer)
    return answer

다른 사람의 풀이

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

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

    if answer == '' :
        return '-1'
    elif len(answer) == answer.count('0'):
        return '0'
    else :
        return answer

9부터 0까지 중복된 횟수만큼 곱해서 answer 문자열에 더해주니 코드가 훨씬 간단하다.. 정렬해줄 필요도 없고 2중반복문을 사용하지 않으니까 훨씬 효율적인 코드이다..

댓글남기기