문제 설명
두 정수 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
의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환합니다.
입출력 예
X | Y | result |
"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으로 되도록 했다
역대급으로 오래걸린 문제 같다.
'코딩테스트 > 프로그래머스(Python)' 카테고리의 다른 글
[프로그래머스] Lv1. 키패드 누르기 (0) | 2023.02.04 |
---|---|
[프로그래머스] Lv1. 기사단원의 무기 (0) | 2023.02.04 |
[프로그래머스] Lv1. 완주하지 못한 선수 (0) | 2023.02.04 |
Lv0. 분수의 덧셈(정답률: 56%) (0) | 2023.02.04 |
Lv1. 명예의 전당 (0) | 2023.02.04 |
Uploaded by Notion2Tistory v1.1.0