📜 문제 설명
두 정수 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
💡 문제 풀이
레벨 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분 정도만에 해결할 수 있었다.
그래도 그 때 보다는 지금이 쪼끔 더 늘었구나 하는 생각에 아주 쪼끔 위로가 될랑말랑한다.
언젠가는 더 많이 늘어서 지금 이 글을 비웃어주고 싶다
'그래도 늘긴 늘었구나' + '아직 한참 멀었구나' 동시에 생각하고 간다
'✨APS (Algorithm Problem Solving) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] LV.3 여행경로 / 파이썬(Python) (0) | 2022.11.30 |
---|---|
[프로그래머스] LV.2 귤 고르기 / 파이썬(Python) (0) | 2022.11.28 |
[프로그래머스] LV.1 명예의 전당 (1) / 파이썬(Python) (0) | 2022.11.25 |
[프로그래머스] LV.0 숨어있는 숫자의 덧셈 (1) / 자바(JAVA) (0) | 2022.11.22 |
[프로그래머스] LV.3 스티커 모으기(2) / 파이썬(Python) (0) | 2022.11.17 |