[Algorithm] 프로그래머스 튜플

Updated:

문제 설명

2021

나의 풀이

import Foundation
func solution(_ s:String) -> [Int] {
    var sCopy = s
    sCopy.removeFirst()
    sCopy.removeLast()
    let replaceArr = sCopy.replacingOccurrences(of: "{", with:"")
    let splitArr = replaceArr.split(separator: "}")
    
    var numbers = [[Int]]()
    for slice in splitArr {
        numbers.append(slice.split(separator: ",").filter { $0 != " "}.map { Int($0)! })
    }
    
    let sortedNumbers = numbers.sorted(by: { $0.count < $1.count })
    
    var answer = [Int]()
    
    for numbers in sortedNumbers {
        for number in numbers {
            if answer.contains(number) {
                continue
            }
            else {
                answer.append(number)
            }
        }
    }

    return answer
}

고민한 점

먼저 어떻게 하면 문자열로 주어진 것을 숫자의 배열 형태로 바꿀 수 있을지를 고민했고, 거기서 앞 뒤의 괄호를 없애고 이후에 }를 기준으로 한 번 자르고, 자른 것에서 , 를 기준으로 자르되 잘랐을 때 공백이 아닌 즉 숫자들만 Int 형으로 변환하여 바꾸어주었습니다.

이후 정렬에 있어서도 2차원 배열을 정렬하는 방법에 대해서 고민했고 찾은 결과

let arr = [[1,2,3],[1],[2,3],[3,4,1,2]]
let sortedArr = arr.sorted(by: { $0.count < $1. count })
// arr = [[1],[2,3],[1,2,3],[3,4,1,2]]

위와 같이 작성하면 길이에 따라서 정렬되게 된다.

괜찮은 남의 풀이

import Foundation
func solution(_ s:String) -> [Int] {
    var s = s
    var answer = [Int]()
    s.removeFirst(2)
    s.removeLast(2)

    s.components(separatedBy: "},{")
        .map { $0.components(separatedBy: ",").map { Int($0)! } }
        .sorted { $0.count < $1.count }
        .forEach {
            $0.forEach {
                if !answer.contains($0) {
                    answer.append($0)
                }
            }
    }
    return answer
}

결국 초반에 어떻게 문자열 처리를 할 지에 대한 차이와 고차함수를 사용해서 깔끔하게 작성했다는 차이 인 것 같다.

참고

Programmers

Leave a comment