프로그래머스 숫자 짝꿍 파이썬

안상철·2023년 5월 20일
0

문제링크

시간초과가 걸린 내 답

def solution(X, Y):
    new_Y = list(Y)
    visited = []
    
    for x in X:
        if x in new_Y:
            visited.append(int(x))
            new_Y.remove(x)

    visited.sort(reverse = True)
    if len(visited) == 0:
        return '-1'
    elif sum(visited) == 0:
        return '0'
    else:
        return ''.join(str(s) for s in visited)

다른 사람들이 해결 한 정답

from collections import Counter

def solution(X, Y):
    # 숫자 개수 세기
    nums = Counter(X) & Counter(Y)
    if not nums: return '-1' # 공통 없는 경우
    elif list(nums) == ['0']: return '0' # 0만 공통인 경우
    
    nums_order = sorted(list(nums),reverse=True) # 내림차순 정렬
    answer = ''
    for num in nums_order:
        answer += num * nums[num]
    return answer

Counter에 리스트나 문자열을 입력으로 주게 되면 그 안에 포함된 원소의 개수를 세어 dictionary와 유사한 Counter 객체를 반환한다.

예를 들어 [1,2,2,3,3,3] 라는 리스트가 있을 때 이를 Counter의 입력으로 주면 Counter({3: 3, 2: 2, 1: 1})가 반환된다.

이때 dictionary와 마찬가지로 key로 접근할 수 있다.

따라서 문자열 X, Y에 포함된 글자의 개수를 Counter로 세고 교집합 기능(&)을 이용하여 중복을 찾아낸다.

1) 중복이 없는 경우엔 -1을 반환한다.

2) 중복이 0으로 유일한 경우엔 0을 반환한다.

3) 그 외의 경우 큰 숫자부터 Counter에 key로 접근하여 개수만큼 정답 문자열에 추가하면 된다.

profile
웹 개발자(FE / BE) anna입니다.

0개의 댓글