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

 

문제

 

문제 μ„€λͺ…

두 μ •μˆ˜ 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"

 

 

μ†ŒμŠ€ μ½”λ“œ
# 1 (μ‹œκ°„ 초과)
def solution(X, Y):
    answer = ""

    inter = []

    for x in X:
        if x in Y:
            inter.append(int(x))
            Y = Y.replace(x,"",1)  

    inter.sort(reverse=True) 
    if len(inter) == 0:
        answer = "-1"
    elif inter[0] == 0:
        answer = "0"
    else:
        for i in inter:
            answer += str(i)
        
    return answer

 

풀이 # 1

  • ꡐ집합 μ›μ†Œλ₯Ό 담을 inter 리슀트 생성
  • Xλ₯Ό λŒλ©΄μ„œ X의 μ›μ†Œκ°€ Y에 있으면 inter λ¦¬μŠ€νŠΈμ— ν•΄λ‹Ή μ›μ†Œ μΆ”κ°€ν•˜κ³  Yμ—μ„œ ν•΄λ‹Ή μ›μ†Œ μ‚­μ œ
    • replace("λ°”κΎΈκΈ° μ „ 문자", "λ°”κΎΌ ν›„μ˜ 문자", λ°”κΎΈκ³  싢은 문자 갯수)
  • inter λ₯Ό λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬
  • interκ°€ 없을 경우 "-1", 0이 μ—¬λŸ¬κ°œμΈ κ²½μš°μ—λŠ” "0"을 좜λ ₯
  • interκ°€ 있고 0이 μ•„λ‹ˆλΌλ©΄ 리슀트λ₯Ό λŒλ©΄μ„œ 문자λ₯Ό answer에 μΆ”κ°€

 

# 2
def solution(X, Y):
    answer = ""

    numberX = [0]*10
    numberY = [0]*10
    
    # 각 μˆ«μžκ°€ λͺ‡ κ°œμ”© μžˆλŠ”μ§€ 카운트
    for x in X:
        numberX[int(x)] += 1
    
    for y in Y:
        numberY[int(y)] += 1


    # λ°˜λ³΅λ¬Έμ„ λŒλ©΄μ„œ μΆ”κ°€
    for idx in range(9,-1,-1):
        if numberX[idx] > 0 and numberY[idx] > 0:
            cnt = min(numberX[idx], numberY[idx])
            answer += (str(idx) * cnt)

    if answer == "":
        answer = "-1"
    elif answer[0] == "0":
        answer = "0"

        
    return answer

 

풀이 #2

  • X와 Y의 각 숫자 갯수λ₯Ό numberX와 numberY에 카운트 (각 숫자 = 인덱슀)
  • sortλ₯Ό ν•˜μ§€ μ•ŠκΈ° μœ„ν•΄ κ°€μž₯ 큰 μˆ˜λΆ€ν„° 반볡문
    • numberX와 numberY에 λ‘˜ λ‹€ μ‘΄μž¬ν•˜λ©΄ λ‘˜ 쀑에 μž‘μ€ 수만큼 answer에 μΆ”κ°€
  • ꡐ집합이 μ—†κ±°λ‚˜ 0이 μ—¬λŸ¬ 개인 경우 처리

 

 

문제 μžμ²΄λŠ” λ‹¨μˆœν•œλ° μ œν•œ 사항을 보면 μ •μˆ˜κ°€ μƒλ‹Ήνžˆ 클 μˆ˜λ„ μžˆλ‹€λŠ” 쑰건이 μžˆλ‹€. sortλ₯Ό μ΄μš©ν•˜λ©΄ μ‹œκ°„μ΄ 였래 κ±Έλ¦¬λ―€λ‘œ sortλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  for문도 10개 숫자 λ‚΄μ—μ„œ λŒλ„λ‘ μ½”λ“œλ₯Ό μˆ˜μ •ν•˜μ˜€λ‹€. ν†΅κ³ΌλŠ” ν–ˆμ§€λ§Œ μ‹œκ°„μ΄ 적게 κ±Έλ¦¬λŠ” 것 κ°™μ§€λŠ” μ•Šλ‹€. μ‹œκ°„ λ³΅μž‘λ„λ„ κ³ λ €ν•΄μ„œ μ½”λ“œλ₯Ό μ§œλŠ” 게 μ€‘μš”ν•œλ°....μ–΄λ ΅κ΅¬λ§Œ...

+ Recent posts