본문 바로가기
🐣 알고리즘

[프로그래머스] Swift - 숫자 짝꿍 (LV.1)

by @Eddy 2023. 6. 22.
728x90

👆문제풀러 가기👆

문제 설명

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

 

풀이 [ 메모리: 164mb, 최대시간: 1317.69ms ] 

import Foundation

func solution(_ X:String, _ Y:String) -> String {
    var dictX = Dictionary(grouping: X, by: {$0})
    var dictY = Dictionary(grouping: Y, by: {$0})
    
    var result = ""
    
    for (k,v) in dictX.sorted{$0.key > $1.key} {
        if dictY[k] != nil { // x에 있는 값이 y에도 있는지 확인.
            let minCnt = v.count < dictY[k]!.count ? v.count : dictY[k]!.count // x와 y가 동일하게 가진 갯수만큼만 추가
            result += String(repeating: k, count: minCnt)
        }
    }
    
    if result.isEmpty { return "-1" } 
    if result.first! == "0" { return "0" }
    
    return result
}

 

 

처음에는 Dictionary로 안 하고 Array와 while문으로 풀어서 시간초과가 났었다.

그러다보니 하나씩 체크하면서 배열에서 제거하는 방식으로 진행하게 됐었다.

어차피 가장 큰 수가 맨 앞에 나오기만 하면 된다면, 굳이 하나씩 체크할 필요는 없지 않을까? 라는 생각이 들었고,

'공통으로 나타나는 정수 k(0 ≤ k ≤ 9)들을 이용하여 만들 수 있는 가장 큰 정수'라는 지문을 활용하면 되겠다고 생각했다.

x값에 있는 정수들을 같은 정수끼리 배열로 grouping해서,

x와 y가 공통적으로 가진 갯수만큼만 값을 반영한다면, 쉽게 풀 수 있겠거니 라는 생각으로 코드를 작성했다.

 

 

근데 의문인 점은,

"00"같은 경우 0으로 수정하기 위해 Int변환하여 result를 String으로 문자열 보간법을 사용해서 풀었을 때에는 틀렸다고 나왔다는 점이다. swift는 21억자리까지 처리할 수 있을거라 문제없을텐데, 어떤 문제인지 잘 모르겠다..

 

 

반응형

댓글