코드
from collections import Counter
def solution(X, Y):
x = Counter(X)
y = Counter(Y)
answer = ''
for i in range(10):
answer += str(i) * (min(x[str(i)], y[str(i)]))
if answer == '':
return '-1'
answer = ''.join(sorted(answer, reverse=True))
if answer[0] == '0':
return '0'
else:
return answer
처음엔 in으로 X의 요소가 Y에 존재하는지 확인하는 방식으로 진행했더니 시간초과라는 글씨도 못 볼만큼 오랜 시간이 소요되었다.
X, Y의 길이가 최대 3,000,000이기 때문에 오랜 시간이 소요될 수밖에 없다.
그래서 어떻게 하면 공통된 정수를 모두 찾을 수 있을 지 생각하다 Counter를 사용하게 되었다.
먼저, Counter를 사용하여 X, Y의 모든 정수들이 몇 번씩 나타났는지 세주었다.
X와 Y는 0부터 9까지의 수로 구성되어 있으므로 for문의 range를 10으로 설정하여 0~9를 순회하였다.
공통된 정수를 찾아야 하므로 x, y에서 해당 숫자가 나타난 횟수 중 작은 쪽을 선택한다.
위 사진에서 '2'는 x에서 2번, y에서 1번 관찰되었으므로 y에서 관찰된 횟수인 1을 택한다.
for i in range(10):
answer += str(i) * (min(x[str(i)], y[str(i)])) # 숫자 * 공통발견횟수
그럼 이제 answer에 공통된 숫자를 출연 횟수만큼 추가한다.
str(i)에 * 연산을 사용하여 공통으로 관찰된 횟수 1만큼 추가해 준다.
for문이 종료되었으면, 이제 리턴값을 결정한다.
문제에서 공통된 숫자가 없으면 -1을 리턴하라고 했으므로 answer가 빈 문자열이면 '-1'을 리턴해준다.
answer = ''.join(sorted(answer, reverse=True))
if answer[0] == '0':
return '0'
else:
return
그다음으로 answer의 공통된 숫자를 가지고 최대 정수를 만든다. '최대' 정수를 만들기 위해 reverse=True를 한다.
이때 모두 0으로 구성되어 있으면(ex. 0, 00, 000...) 0을 리턴해야 한다.
이는 answer의 첫 번째 요소를 보면 알 수 있으므로, answer[0]이 0이면 '0'을 리턴한다.
0이 아니면, 최대 정수인 answer를 리턴한다.