프로그래머스 - 숫자 짝궁

dobyming·2023년 1월 2일
0

문제 설명

두 정수 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"

내 코드

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하는 문제였다. 문제 자체가 어렵다기 보다는, 코드로 녹여내는 로직에서 복잡한 문제였다.

여기서 가장 핵심적인 코드는 XY 를 핸들링 하는 부분이다.
1. 문자열로 들어오는 파라미터를 정수형 배열로 전환
2. 그 배열을 집합체로 각각 생성
3. 집합체의 교집합으로 겹치는 숫자들 check

+) 집합 관련 문제를 풀면서 참고할만한 Tip
집합도 정렬 메소드 sorted , sort 가 가능하다.
참고

그리고 코딩 테스트 문제를 풀다보면

배열 내의 요소값모두 0일때 조건을 처리해야 될때 아이디어는 다음과 같이 생각하면 유용하게 써먹을 수 있다. (사실 내가 이런 조건이 등장할때마다 아이디어가 떠오르지 않아 여기다가 기록..함 ㅜㅜ)

배열 내부의 값의 합이 모두 0 이면 이 조건에 해당하는 어떤 시뮬레이션을 보여줌
if sum(array_name) == 0 // .. 이런식으로.. 활용하면 좋다.

0개의 댓글