일기 대신 코드 슬쩍

[프로그래머스] Lv1. 숫자 짝궁 본문

코딩테스트/프로그래머스(Python)

[프로그래머스] Lv1. 숫자 짝궁

코코자 2023. 2. 4. 22:01

문제 설명

두 정수 XY의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수를 두 수의 짝꿍이라 합니다(단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용합니다). XY의 짝꿍이 존재하지 않으면, 짝꿍은 -1입니다. XY의 짝꿍이 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 한 개는 짝 지을 수 없습니다.)두 정수 XY가 주어졌을 때, XY의 짝꿍을 return하는 solution 함수를 완성해주세요.

제한사항

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

입출력 예

XYresult
"100""2345""-1"
"100""203045""0"
"100""123450""10"
"12321""42531""321"
"5525""1255""552"

문제 풀이(+10)

  • 테스트 케이스 11~15 시간초과 오류
from collections import Counter # Counter 모듈 사용
def solution(X, Y):
    answer = []
    intersection = (Counter(str(X)) & Counter(str(Y))) # X와 Y의 교집합을 {공통숫자:공통숫             자의 개수} 로 만들어줌
    for i in intersection: # intersection 딕셔너리에서
        for j in range(intersection[i]): # intersection에서 value값 즉, 공통 숫자의 개수만큼 반복
            answer.append(i) # answer에 해당 숫자 추가
    jjak = ''.join(str(s) for s in sorted(answer,reverse= True)) # answer을 내림차순으로 정렬한 후 join메서드 활용하여 문자열 전환
    if len(answer) >= 1: # 1) 공통숫자가 존재하는 경우
        return jjak if int(jjak) != 0 else '0' # 공통숫자가 0으로만 구성된 경우도 생각해줌
    else: # 2) 공통숫자가 존재하지 않는 경우
        return '-1' # -1 반환
from collections import Counter # Counter 모듈 사용
def solution(X, Y):
    jjak = '-1'
    intersection = Counter(X) & Counter(Y) # X와 Y의 교집합을 {공통숫자:공통숫자의 개수} 로 만들어줌
    if intersection: # 교집합이 있으면
        jjak = ''
        for i in sorted(intersection,reverse = True):
            jjak += i * intersection[i] # jjak에 공통숫자와 그 개수만큼 추가
        return jjak if int(jjak) != 0 else '0'  
    else:
        return jjak
def solution(X, Y):
    jjak = ''
    if set(X)&set(Y):
        for i in sorted(set(X)&set(Y),reverse = True):
            for j in range(min(X.count(i),Y.count(i))):
                jjak += i  
        return jjak if int(jjak) != 0 else '0'  
    return '-1'
테스트 1 〉통과 (0.03ms, 10.3MB)
테스트 2 〉통과 (0.03ms, 10.3MB)
테스트 3 〉통과 (0.03ms, 10.3MB)
테스트 4 〉통과 (0.03ms, 10.5MB)
테스트 5 〉통과 (0.02ms, 10.4MB)
테스트 6 〉통과 (0.09ms, 10.4MB)
테스트 7 〉통과 (0.09ms, 10.4MB)
테스트 8 〉통과 (0.07ms, 10.4MB)
테스트 9 〉통과 (0.06ms, 10.3MB)
테스트 10 〉통과 (0.08ms, 10.3MB)
테스트 11 〉실패 (시간 초과)
테스트 12 〉실패 (시간 초과)
테스트 13 〉실패 (시간 초과)
테스트 14 〉실패 (시간 초과)
테스트 15 〉실패 (시간 초과)
테스트 16 〉통과 (0.02ms, 10.3MB)
테스트 17 〉통과 (0.03ms, 10.2MB)
테스트 18 〉통과 (0.00ms, 10.2MB)
테스트 19 〉통과 (0.00ms, 10.3MB)
채점 결과
정확성: 73.7
합계: 73.7 / 100.0

도대체 어디가…… 11~15번 테케가 뭐 숫자가 삼백만개정도라고 하는데

성공!

def solution(X, Y):
    jjak = '-1'
    if set(X)&set(Y): # X랑 Y에 공통 숫자가 있는 경우
        jjak = ''
        for i in range(9,-1,-1): # sort를 쓰면 시간초과가 나니까 9~0까지의 순서
            jjak += str(i) * min(X.count(str(i)),Y.count(str(i)))
        
    return jjak if jjak[0] != '0' else '0' # 공통숫자가 0뿐인 경우도 고려

처음엔 Counter 모듈 연습하고 싶어서 써봤는데 계속되는 시간초과에 …

포기함

근데도 sorted 쓰니까 계쏙 시간초과 오류나서 어차피 범위가 0~9고 내림차 순이니까 9~0으로 되도록 했다

역대급으로 오래걸린 문제 같다.