λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
⌨️ Language/swift

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1] 숫자 짝꿍

by hyebin (Helia) 2023. 3. 8.
λ°˜μ‘ν˜•
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ LV.1 λͺ¨μŒ

숫자 짝꿍

문제 μ„€λͺ…

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

  • X, Y의 짝꿍은 μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ "-1"을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #2

  • X, Y의 κ³΅ν†΅λœ μˆ«μžλŠ” 0으둜만 κ΅¬μ„±λ˜μ–΄ 있기 λ•Œλ¬Έμ—, 두 수의 짝꿍은 μ •μˆ˜ 0μž…λ‹ˆλ‹€. λ”°λΌμ„œ "0"을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #3

  • X, Y의 짝꿍은 10μ΄λ―€λ‘œ, "10"을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #4

  • X, Y의 짝꿍은 321μž…λ‹ˆλ‹€. λ”°λΌμ„œ "321"을 return ν•©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예 #5

  • 지문에 μ„€λͺ…λœ μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

제좜

import Foundation

func solution(_ X:String, _ Y:String) -> String {
    var x = [0,0,0,0,0,0,0,0,0,0]
    var y = [0,0,0,0,0,0,0,0,0,0]
    var union = ""

    for i in X{
        x[Int(String(i))!] += 1
    }

    for i in Y{
        y[Int(String(i))!] += 1
    }

    for i in (0..<10).reversed(){
        var minValue = min(x[i], y[i])
        if minValue != 0{
            union += String(repeating: String(i), count: minValue)
        }
    }

    if union.isEmpty{ return "-1" }

    return (union.first! == "0") ? "0" : union
}
0λΆ€ν„° 9κΉŒμ§€ 각 숫자의 개수λ₯Ό 담을 λ°°μ—΄ x, yλ₯Ό μ„ μ–Έν•œλ‹€.
X와 Y 각각 λ°°μ—΄ x, y에 μžμ‹ μ΄ κ°–κ³  μžˆλŠ” 숫자의 개수λ₯Ό μ €μž₯ν•œλ‹€.

9λΆ€ν„° 0κΉŒμ§€ iλ₯Ό κ°μ†Œμ‹œν‚€λ©° for문을 λ™μž‘ν•œλ‹€.
min ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄ x, y 배열에 λ‹΄κΈ΄ 숫자의 μ΅œμ†Œ 개수λ₯Ό κ΅¬ν•œ ν›„, μ΅œμ†Œ κ°œμˆ˜κ°€ 0이 μ•„λ‹Œ κ²½μš°μ— 결괏값을 λ‹΄λŠ” union λ³€μˆ˜μ— 숫자λ₯Ό μ΅œμ†Œ 개수만큼 λ°˜λ³΅ν•˜μ—¬ μΆ”κ°€ν•œλ‹€.

union λ³€μˆ˜κ°€ λΉ„μ–΄μžˆλŠ” κ²½μš°μ—λŠ” -1을 λ°˜ν™˜ν•œλ‹€.
union λ³€μˆ˜μ˜ 첫 번째 값이 0인 κ²½μš°μ—λŠ” 0을 λ°˜ν™˜ν•œκ³  λ‚˜λ¨Έμ§€ κ²½μš°μ—λŠ” union λ³€μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.

λ‹€λ₯Έ 풀이

import Foundation

func solution(_ X:String, _ Y:String) -> String {
    let arrX = Array(X), arrY = Array(Y)
    let union = Set(arrX).intersection(arrY).sorted(by: >)
    var result = ""
    union.forEach{ key in
        result += String(repeating: key, count: min(arrX.filter{$0 == key}.count, arrY.filter{$0 == key}.count))
    }
    
    return result == "" ? "-1" : (result.first! == "0" ? "0" : result)
}
μž…λ ₯받은 λ¬Έμžμ—΄ X, Yλ₯Ό 각각 λ°°μ—΄ arrX, arrY둜 λ³€ν™˜ν•œλ‹€.
arrXλ₯Ό Set으둜 λ³€ν™˜ν•œ ν›„ arrYμ™€μ˜ ꡐ집합을 κ΅¬ν•œ ν›„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜μ—¬ union 배열에 μ €μž₯ν•œλ‹€.

union λ°°μ—΄μ˜ μš”μ†Œλ₯Ό arrXκ°€ κ°–κ³  μžˆλŠ” κ°œμˆ˜μ™€ arrYκ°€ κ°–κ³  μžˆλŠ” 개수λ₯Ό λΉ„κ΅ν•˜μ—¬ 더 μž‘μ€ 수만큼 λ°˜λ³΅μ‹œμΌœ result λ³€μˆ˜μ— μ €μž₯ν•œλ‹€.
result λ³€μˆ˜κ°€ λΉ„μ–΄μžˆμœΌλ©΄ -1을, 첫 λ²ˆμ§Έκ°€ 0이면 0을 μ•„λ‹ˆλΌλ©΄ resultλ₯Ό λ°˜ν™˜ν•œλ‹€.

 

λ°˜μ‘ν˜•