✨APS (Algorithm Problem Solving)/프로그래머스

[프로그래머스] LV.1 숫자 짝꿍 / 파이썬(Python) + TMI 나의 성장기

Nyan cat 2022. 11. 25. 14:15

 

📜 문제 설명

두 정수 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의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.

입출력 예

 

🔗 문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

💡 문제 풀이

레벨 1이지만 호락호락하지만은 않은 문제이다. sort를 많이 쓰면 시간 초과도 쉽게 나고 생각해야 할 요소들이 많은 문제이다. 프로그래머스 문제 많이 풀어서 점수 잘 안올라가는 나도 이 문제로 2점을 획득했다.

Counter에 최적화된 문제

  • 두 문자에 공통으로 사용된 숫자를 들고와서 최대의 수를 만든다 ➡내림차순으로 정렬을 해주어야 하는데 정렬을 많이 쓰면 시간초과가 그냥 난다 ➡ 그래서 X와 Y중에 한 문자만 내림차순으로 정렬을 해준다 
  • 각각 Counter를 사용해서 각 문자에 사용된 숫자의 갯수를 세어준다
  • X와 Y 중에 정렬된 문자를 기준으로 잡고 (그래야 큰 숫자 부터 더해줄 수 있음) 다른 쪽 문자에도 해당 숫자가 사용되었다면 더 적게 사용된 횟수만큼 해당 숫자를 더한다 (예를 들어 X에는 9가 세 번, Y에는 9가 두번 있다면 9를 두 번 더해서 '99'가 된다) ➡ 공통으로 사용된 숫자가 없으면 그냥 -1을 리턴한다
  • 공통 사용된 숫자를 들고 왔는데 0만 있고 0이 여러번 사용됐으면 '0'을 리턴한다. 숫자적인 의미에서 0 = 00 = 000 = 000..... 이기 때문에 
  • 위의 예외 경우들을 제외하고는 아까 만들어놓은 정답 문자열을 리턴한다
from collections import Counter

def solution(X, Y):
    answer1 = '-1'
    answer2 = ''
    X = sorted(X, reverse = True)
    x_counter = Counter(X)
    y_counter = Counter(Y)
    
    for x in x_counter:
        if x in y_counter:
            answer2 += x * min(x_counter[x], y_counter[x])
    
    if answer2 == '':
        return answer1
    
    tmp_counter = Counter(answer2)
    if tmp_counter['0'] > 1 and len(tmp_counter) == 1:
        return '0'
    
    return answer2

 

😆 그냥 TMI

세상에.. 생각없이 아직 안 푼 문제라서 이 문제를 풀려고 클릭했다가 깜짝 놀랐다.

기억도 안나는 언젠가 내가 이 문제를 풀려고 엄청 끙끙 헤매다가 3트 정도 하고 포기한 흔적이 있었다.

아마 싸피할 때 아무것도 모른던 때로 추정됨 (지금도 아무것도 모르지만)

그 때 짜놨던 코드를 보니까 정말 말 그대로 고군분투의 흔적이 느껴졌다. 

말도 안되는 로직과 별별 함수를 다 끌어와서는 몇 번 시도를 하다하다 포기했나 보다. 안쓰러워라..

이번에는 이 문제를 15분 정도만에 해결할 수 있었다.

그래도 그 때 보다는 지금이 쪼끔 더 늘었구나 하는 생각에 아주 쪼끔 위로가 될랑말랑한다.

언젠가는 더 많이 늘어서 지금 이 글을 비웃어주고 싶다

'그래도 늘긴 늘었구나' + '아직 한참 멀었구나' 동시에 생각하고 간다

반응형