Programing/프로그래머스 오답노트

[프로그래머스] 숫자 짝꿍 - ( set의 중복 요소 반영 트릭 )

yooom 2023. 9. 17. 22:39
문제 설명

두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0입니다. 예를 들어, X = 3403이고 Y = 13203이라면, X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 3, 0, 3으로 만들 수 있는 가장 큰 정수인 330입니다. 다른 예시로 X = 5525이고 Y = 1255이면 X와 Y의 짝꿍은 X와 Y에서 공통으로 나타나는 2, 5, 5로 만들 수 있는 가장 큰 정수인 552입니다(X에는 5가 3개, Y에는 5가 2개 나타나므로 남는 5 한 개는 짝 지을 수 없습니다.) 두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return하는 solution 함수를 완성해주세요.

 

 

풀이
def solution(X, Y):
    x_arr = list(X)
    y_arr = list(Y)
    num_arr = []
    
    for i in x_arr:
        if i in y_arr:
            num_arr.append(i)   # 겹치는 수, 새로운 배열에 추가
            y_arr.remove(i)     # 겹치는 수, Y에서 제거
    if len(num_arr) > 0:
        num_arr.sort(reverse=True) 
        answer = str(int(''.join(num_arr))) # 00 이 나오는 경우 0으로 바꾸기 위해 int()  
    else:
        answer = str(-1) # 정답은 str 타입으로 받는다
    return answer

테스트 케이스 11~15가 시간초과가 났다.  오답이다. for 에서 숫자를 하나씩 읽는 과정만 수정하면 되지 않을까 싶다.

dict과 set을 써서 해결해보자.

 

 

def solution(X, Y):
    answer = []
    for i in (set(X) & set(Y)):      # set을 쓰면 100 같은 중복은 10이 반환
        for j in range(min(X.count(i), Y.count(i))) :
            answer.append(i)         # 중복 값을 중복 수 만큼 추가
    answer.sort(reverse=True)
    
    if len(answer) == 0:             # 예외처리
        return "-1"
    if answer[0] == "0":
        return "0"
    answer = "".join(answer)
    return answer

한 블로그에서는 이렇게 set을 썼다. set은 중복을 무시하기 때문에 사용이 까다로웠는데 단순하게 해결했다.

 

 

def solution(X, Y):
    answer = []
    x_arr = {}
    y_arr = {}
    
    for i in X:
        x_arr[i] = x_arr.get(i,0) + 1    # {'1': 1, '0': 2}
    for i in Y:
        y_arr[i] = y_arr.get(i,0) + 1    # {'2': 1, '3': 1, '4': 1, '5': 1} 가 된다.
    
    for key in x_arr:               # .items()를 쓰면 key, value 모두 받음
        if key in y_arr.keys():     # y_arr만 써도 됨 // key가 없는데 조사를 하면 오류가 남 
            while x_arr[key] > 0 and y_arr[key] > 0: # ex) 100 / 2345 에서 key = 1 없음
                answer.append(key)
                x_arr[key] -= 1     # x_arr[key] = x_arr.get[(key) -1
                y_arr[key] -= 1
                
    answer.sort(reverse = True)
                
    if len(answer) == 0:
        return "-1"
    if answer[0] == "0":
        return "0"
    answer = "".join(answer)
    return answer

dict로 해결하는 것도 유사하게 진행된다.

 

 

출처

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

728x90