새소식

⌨️ Algorithms/프로그래머스

[Python] 프로그래머스 Lv1_숫자 짝꿍

2023. 1. 4. 22:14

  • -

https://school.programmers.co.kr/learn/courses/30/lessons/131128

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

  • 두 수의 짝꿍: 두 정수 X, Y의 임의의 자리에서 공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수
    • 단, 공통으로 나타나는 정수 중 서로 짝지을 수 있는 숫자만 사용
  • X, Y의 짝꿍이 존재하지 않으면, 짝꿍은 -1
  • X, Y의 짝꿍이 0으로만 구성되어 있다면, 짝꿍은 0
  • 두 정수 X, Y가 주어졌을 때, X, Y의 짝꿍을 return
  • ex)
    • 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 한 개는 짝 지을 수 없음)

제한사항

  • 3 ≤ X, Y의 길이(자릿수) ≤ 3,000,000
  • X, Y는 0으로 시작하지 않음
  • X, Y의 짝꿍은 상당히 큰 정수일 수 있으므로, 문자열로 반환

 

"""
입출력 예시)

X = "100", Y = "2345" -> "-1"
X = "100", Y = "203045"	 -> "0"
X = "100", Y = "123450" -> "10"
X = "12321", Y = "42531" -> "321"
X = "5525", Y = "1255" -> "552"
"""

 

## 의사코드 ##

## X와 Y에서 공통으로 나타나는 숫자 문자열을 구하기##

#   Counter()를 활용해서 dict 형태로 X와 Y의 각 원소와 그 원소의 개수를 구함 -> {'숫자 문자열': 개수}
#   for 문을 돌면서 dict의 key값인 X의 원소가 Y에도 있고, 그 원소가 각각의 dict에서 값이 0이 아니면(X, Y에서 공통된 정수이면)
#       그 원소를 리스트에 삽입하고, 각각의 dict에서 값 -1 함 (개수 빼주기)


## 공통으로 나타난 숫자 문자열을 담은 리스트에서 permutations로 가장 큰 정수인 짝꿍을 구함##
# -> 이때, 개수는 len(리스트)로 구함 (만들 수 있는 가장 큰 정수를 만들어야 하니까)

#   permutations 구하기 -> str 원소 그대로 사용
#   from itertools import permutations
#   permu = list(permutations(리스트, len(리스트)))

#   permu의 각 원소에서 str을 합쳐서 하나의 정수로 만들기 -> "".join()
#   리스트의 str 원소를 int로 변환 -> list(map(int, 리스트))
#   max(리스트)로 가장 큰 정수를 뽑아서 str()으로 변환하기


## 짝꿍 반환 ##

# X와 Y의 짝꿍이 0으로만 되어있으면
#   return "0"

# X와 Y의 짝꿍이 존재하지 않으면
#   return "-1"

# else:
#   return 짝꿍

 

 

 

통과한 코드

 

from collections import Counter

def solution(X, Y):
    X_dict = Counter(X)
    Y_dict = Counter(Y)
    common = [] # 공통으로 나타나는 정수를 담을 리스트

    for k in X_dict.keys(): # X에 있는 숫자가 
        if k in Y_dict.keys(): # Y에도 있으면
            while X_dict[k] > 0 and Y_dict[k] > 0: # 그리고 그 숫자가 X와 Y의 dict에서 값이 모두 0보다 크면 (X, Y에서 공통된 정수이면)
                common.append(k) # 숫자를 common에 삽입
                X_dict[k] -= 1 # X의 dict에서 그 숫자가 나온 횟수 -1
                Y_dict[k] -= 1 # Y의 dict에서 그 숫자가 나온 횟수 -1
    
    # 가장 큰 정수를 만들기 위해 큰 수부터 내림차순 정렬
    common.sort(reverse=True)
    
    # X와 Y의 짝꿍이 존재하지 않으면
    if len(common) == 0:
        return "-1"
    # X와 Y의 짝꿍이 0으로만 되어있으면 
    elif common.count("0") == len(common):
        return "0"
    return ''.join(common) # common의 각 원소를 합쳐서 하나의 정수로 만들기

 

-> 처음에는 공통으로 나타나는 정수들을 구해서 permutations로 만들 수 있는 수들의 조합을 구한 다음, 가장 큰 정수인 짝꿍을 구하는 것으로 생각했는데

그냥 공통으로 나타나는 정수들을 담은 리스트를 큰 수부터 오도록 내림차순 정렬해서 join() 하면 끝남

 

 

  • X와 Y에서 공통으로 나타나는 숫자 문자열 구하기
    • -> Counter() 활용
X = "3403"
Y = "13203"

from collections import Counter
X_dict = Counter(X)
Y_dict = Counter(Y)
print('X:', X_dict)
print('Y:', Y_dict, '\n')

common = []
for k in X_dict.keys():
    if k in Y_dict.keys():
        while X_dict[k] > 0 and Y_dict[k] > 0:
            common.append(k)
            X_dict[k] -= 1
            Y_dict[k] -= 1
print('common:', common)
print('남은 X:', X_dict)
print('남은 Y:', Y_dict)

"""
X: Counter({'3': 2, '4': 1, '0': 1})
Y: Counter({'3': 2, '1': 1, '2': 1, '0': 1}) 

common: ['3', '3', '0']

남은 X: Counter({'4': 1, '3': 0, '0': 0})
남은 Y: Counter({'1': 1, '2': 1, '3': 0, '0': 0})
"""

 

 

  • cf) 리스트의 원소가 문자열일 때 정렬하기 
li = ['303', '330', '033', '033', '330', '303', '40']
li.sort()
li

"""
['033', '033', '303', '303', '330', '330', '40']
"""

-> 문자열인 상태에서 정렬하면 일단 맨 앞자리 수부터 비교함 ('330'보다 '40'이 더 큰 것으로 간주)

 

 

 

참고)

 

https://skeo131.tistory.com/48

 

[Python] max(str, ...)에 대해서

보통 max()에 대해서 설명한다면 다음과 같다. 'iterable한 object를 받아서 그 중 최댓값을 반환하는 내장함수이다.' 하지만 max()는 숫자형 뿐만 아니라 문자열 또한 비교할 수 있는데 이는 다음과 같

skeo131.tistory.com

 

https://wikidocs.net/16

 

02-5 딕셔너리 자료형

`[추천 동영상 강의]` : [https://www.youtube.com/watch?v=BmXDox6ZFzo](https://www.youtube.com/watch?v=BmXDo…

wikidocs.net

 

https://velog.io/@bobsini601/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EC%A7%9D%EA%BF%8D

 

[프로그래머스] 숫자 짝꿍 (Python)

딕셔너리를 사용한 문제

velog.io

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다!