문제 설명

두 정수 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 중 문자열이 짧은것을 Dictionary에 저장한다. [String: Int] 로 문자열에 나온 숫자의 갯수를 저장

문자열이 긴 문자를 돌면서 같은 문자가 나오는지 검사한다. 문자의 갯수는 저장된 dict에서 차감시키면서 검사

조건에 만족하는 문자들을 따로 배열에 저장해서 출력한다

 

문자열의 길이가 최대 3,000,000 이여서 자칫 잘못하면 시간초과가 뜰꺼라 생각하고 for 반복문을 단독적으로 사용하게끔 했다.

그리고 고차함수와 배열의 함수 map, filter, sort, joined를 겹겹이 사용하지 않도록 유의했다.

예로 return result.sort{ $0 > $1}.joined(separator: "") 은 시간초과가 떴고,

정렬을 따로하고 return result.joined(separator: "") 을 하니 아슬아슬하게 초과가 뜨지않았다.

 

 

import Foundation

func solution(_ X:String, _ Y:String) -> String {
    var xArr = X.map{String($0)}
    var yArr = Y.map{String($0)}
    var dict = [String: Int]()
    var result = [String]()

    if xArr.count > yArr.count {
        for i in yArr {
            if dict[String(i)] == nil {
                dict[String(i)] = 1
            } else {
                dict[String(i)]! += 1
            }
        }
        for j in 0..<xArr.count {
            if dict[xArr[j]] == nil || dict[xArr[j]]! == 0 {
                continue
            } else {
                dict[xArr[j]]! -= 1
                result.append(xArr[j])
            }
        }
    } else {
        for i in xArr {
            if dict[String(i)] == nil {
                dict[String(i)] = 1
            } else {
                dict[String(i)]! += 1
            }
        }
        for j in 0..<yArr.count {
            if dict[yArr[j]] == nil || dict[yArr[j]]! == 0 {
                continue
            } else {
                dict[yArr[j]]! -= 1
                result.append(yArr[j])
            }
        }
    }
    result.sort{ $0 > $1}
    if result.isEmpty {
        return "-1"
    } else {
        if result.filter{ $0 == "0"}.count == result.count {
            return "0"
        } else {
            return result.joined(separator: "")
        }
    }
    
}

 

 

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

신고 결과 받기 Swift  (0) 2023.04.10
성격 유형 검사하기 Swift  (0) 2023.04.10
삼총사 Swift  (0) 2023.04.10
콜라 문제 Swift  (0) 2023.04.10
옹알이(2) Swift  (0) 2023.04.10

+ Recent posts