문제 설명

두 정수 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 함수를 완성해주세요.

제한사항

  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000입니다.
  • X, Y는 0으로 시작하지 않습니다.
  • X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
  • 문제 보러가기


문제 풀이

(1) 코드 작성(dictionary)

def solution(X, Y):
    # 짝꿍이 존재하지 않는 경우
    if len(set(X) & set(Y)) == 0:
        return "-1"
    # 짝꿍이 존재하는 경우
    dic_x = {x:0 for i, x in enumerate(list(X))}
    dic_y = {y:0 for i, y in enumerate(list(Y))}
    xy = []
    # X, Y에 각 숫자별 개수를 value 값에 저장
    for k in list(X): dic_x[k] += 1
    for k in list(Y): dic_y[k] += 1
    # 짝꿍을 선별하는 과정
    for k, v in dic_x.items():
        if k in dic_y.keys():
            for i in range(min([v, dic_y[k]])):
                xy.append(k)
    # 짝꿍의 종류가 하나인 경우, 그 정수만 반환
    if len(set(xy)) == 1:
        return xy[0]
    return "".join(sorted(xy)[::-1])

(2) 코드 작성(count)

def solution(X, Y):
    # 짝꿍이 존재하지 않는 경우
    if len(set(X) & set(Y)) == 0:
        return "-1"
    # 짝꿍이 존재하는 개수만큼 answer에 넣어주는 과정
    answer = ""
    for n in range(10):
        answer += str(n) * min([X.count(str(n)), Y.count(str(n))])
    # 짝꿍의 종류가 하나인 경우 하나의 값만 반환, 두 개 이상인 경우 역수로 큰 값 반환
    return answer[::-1] if len(set(answer)) > 1 else answer[0]

(3) 코드 리뷰

이번엔 문제를 두 가지 방법으로 풀어보았다. 첫 번째 방법은 딕셔너리를 사용해서 X, Y 별로 가지고 있는 짝꿍을 불러오는 것이다. 두 번째 방법은 count 함수를 사용해서 X, Y가 가지고 있는 숫자의 개수(최솟값)만큼 answer에 더하여 숫자의 짝꿍을 불러왔다. dictonary를 사용하니(1번 방법) 테스트 11번 부터 실행되는데 시간이 많이 소요되었다. 아무래도 반복문이 여러번 사용되었고, 반복문 안에 조건문 + 반복문이 존재하기 때문에 연산과정이 많았을 것이다. 특히 제한사항을 보면 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000 라는 점에서 하나씩 반복하여 찾고 선별하는 과정보다는 count 함수를 사용하여 개수를 가져오는 것이 더 좋다고 생각한다.


👩🏻‍💻개인 공부 기록용 블로그입니다
오류나 틀린 부분이 있을 경우 댓글 혹은 메일로 따끔하게 지적해주시면 감사하겠습니다.

댓글남기기