πŸ§‘πŸ»‍πŸ’» Coding Test/⌨️ Programmers

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

EarthSea 2024. 3. 19. 11:01

 

πŸ„ μ½”λ”©ν…ŒμŠ€νŠΈ

μ½”λ”©ν…ŒμŠ€νŠΈ 문제 풀이

✍🏻 Github

문제 풀이 github 링크

 

 

문제 μ„€λͺ…

두 μ •μˆ˜ 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 {
    
    let setX = Set(X)
    let setY = Set(Y)
    let intersect = setX.intersection(setY)
    
    var duplication = [String]()
    
    for i in Array(intersect) {
        let count = min(Y.filter{ $0 == i }.count, X.filter{ $0 == i }.count)
        (0..<count).forEach{ _ in duplication.append(String(i)) }
    }
    
    if duplication.isEmpty {
        return "-1"
    }else if duplication.filter{ $0 == "0" }.count == duplication.count {
        return "0"
    }
    
    return duplication.sorted(by: >).joined()
}

 

풀이 μ‹œκ°„μ„ ν•œ μ‹œκ°„μ„ λ„˜κ²¨λ²„λ Έμ§€λ§Œ, 쑰금만 더 ν•˜λ©΄ 풀릴 것 κ°™μ•„μ„œ 계속 λΆ™μž‘κ³  μžˆμ—ˆλ”λ‹ˆ κ·Έ κ²°κ³Ό 10λΆ„ 뒀에 ν•΄κ²°ν•  수 μžˆμ—ˆλ‹€. ν•˜μ§€λ§Œ 첫 ν’€μ΄κ³Όμ •μ˜ κ²°κ³ΌλŠ” κ·Έμ € μ²˜μ°Έν–ˆλ‹€.

 

λ„μ €νžˆ 뭐가 λ¬Έμ œμΈμ§€ λ°˜λ‘€λ₯Ό 찾을 수 μ—†μ–΄μ„œ "μ§ˆλ¬Έν•˜κΈ°"λ₯Ό μ“°μœ½ λ΄€λ‹€. λ‚΄κ°€ λ†“μΉœ 뢀뢄은 X와 Y의 λ¬Έμžμ—΄μ˜ 길이의 μ΅œλŒ“κ°’μ΄ Int의 μ΅œλŒ“κ°’μ„ λ„˜μ–΄κ°„λ‹€λŠ” μ‚¬μ‹€μ΄μ—ˆλ‹€. μ²˜μŒμ— “00” μ΄λ‚˜ “000”, “” 이 좜λ ₯λ˜λŠ” 과정을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œ guard let 문을 μ¨μ„œ Int κ°’μœΌλ‘œ 바꿔버린 ν›„ λ‹€μ‹œ String 으둜 λ°”κΎΈλ €κ³  μ‹œλ„ν–ˆλ‹€. κ·ΈλŸ¬λ‹ˆ Int κ°’μœΌλ‘œ λ°˜ν™˜λ˜λŠ” κ³Όμ •μ—μ„œ Int의 λ²”μœ„λ₯Ό λ²—μ–΄λ‚˜ μ˜¬λ°”λ₯Έ 값이 좜λ ₯λ˜μ§€ μ•Šμ•˜λ˜ 것이닀.

 

이λ₯Ό ν•΄κ²°ν•˜κΈ°μœ„ν•΄ Int둜 λ°”κΎΈλŠ” λŒ€μ‹  if문을 μ²¨κ°€ν–ˆλ‹€. 첫 λ²ˆμ§ΈλŠ” κ²ΉμΉ˜λŠ” μˆ«μžλ§Œμ„ λ„μΆœν•œ duplication배열이 λΉ„μ–΄μžˆλŠ”μ§€ 확인 ν›„ “-1”을 좜λ ₯ν•˜λŠ” 것이고, 두 λ²ˆμ§ΈλŠ” λ¬Έμžμ—΄μ—μ„œμ˜ “0”의 κ°―μˆ˜κ°€ λ¬Έμžμ—΄μ˜ 길이와 κ°™λ‹€λ©΄ “0”을 좜λ ₯ν•˜λ„λ‘ ν•˜λŠ” 것이닀.

 

μ²˜μŒμ— μ“Έλ°μ—†λŠ” for문을 λ„λŠ” 것을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ ꡐ집합 연산을 ν™œμš©ν•΄ 두 λ°°μ—΄μ˜ κ³΅ν†΅λœ 값을 μ°Ύμ•˜λ‹€. 이 뢀뢄이 μ‹œκ°„μ„ 쀄일 수 μžˆλ„λ‘ 도와쀀 것 κ°™λ‹€.

 

λ‹€λ₯Έ μ‚¬λžŒ 풀이

import Foundation

func solution(_ X:String, _ Y:String) -> String {
    let arr1 = Array(X)
    let arr2 = Array(Y)
    let uniqueKey = Set(arr1).intersection(Set(arr2))
    var answer = ""
    for key in uniqueKey.sorted(by: >) {
        answer += String(repeating: key, count: min(arr1.filter{$0 == key}.count, arr2.filter{$0 == key}.count))
    } 
    return answer == "" ? "-1" : ((uniqueKey.count == 1 && uniqueKey.contains("0")) ? "0" : answer)
}

 

풀이 방법은 λΉ„μŠ·ν•˜λ‚˜ answer에 값을 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ λ„μΆœν•˜μ—¬ String의 + 연산을 ν™œμš©ν•΄ λ°”λ‘œ answer을 λ§Œλ“€μ–΄ λƒˆλ‹€λŠ” 점이닀.

duplication.sorted(by: >).joined() 이 과정을 μƒλž΅ν•  수 μžˆμ–΄μ„œ μ’€ 더 효율적인 풀이 방법인 것 κ°™λ‹€.

 

 

μ€‘μš”ν•œ κ°œλ…

- A와 B의 κ΅μ§‘ν•©κ΅¬ν•˜κΈ°

A.intersection(B)