두 정수 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 함수를 완성해주세요.
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" |
def solution(X, Y):
answer = ''
arr_X = list(map(int,list(X)))
arr_Y = list(map(int,list(Y)))
set_X = set(arr_X)
set_Y = set(arr_Y)
intersect = set_X & set_Y
if intersect: #set() 빈값이 아니라면
sort_num = sorted(intersect,reverse=True)
if sum(sort_num) == 0:
answer = '0'
else:
for num in sort_num:
answer += str(num) * min(arr_X.count(num),arr_Y.count(num))
else: #일치 요소가 없을때
answer = '-1'
return answer
배열, 집합을 자유자재로 잘 다루는지 check하는 문제였다. 문제 자체가 어렵다기 보다는, 코드로 녹여내는 로직에서 복잡한 문제였다.
여기서 가장 핵심적인 코드는 X
와 Y
를 핸들링 하는 부분이다.
1. 문자열로 들어오는 파라미터를 정수형 배열로 전환
2. 그 배열을 집합체로 각각 생성
3. 집합체의 교집합으로 겹치는 숫자들 check
+) 집합 관련 문제를 풀면서 참고할만한 Tip
집합도 정렬 메소드 sorted
, sort
가 가능하다.
참고
그리고 코딩 테스트 문제를 풀다보면
배열 내의 요소값이 모두 0일때 조건을 처리해야 될때 아이디어는 다음과 같이 생각하면 유용하게 써먹을 수 있다. (사실 내가 이런 조건이 등장할때마다 아이디어가 떠오르지 않아 여기다가 기록..함 ㅜㅜ)
배열 내부의 값의 합이 모두 0 이면 이 조건에 해당하는 어떤 시뮬레이션을 보여줌
if sum(array_name) == 0 // ..
이런식으로.. 활용하면 좋다.