본문 바로가기
Xcode/Swift - Algorithm

Swift ) 프로그래머스(Lv2) - 튜플 (Dictionary)

by 후르륵짭짭 2020. 9. 3.
728x90
반응형

programmers.co.kr/learn/courses/30/lessons/64065

 

코딩테스트 연습 - 튜플

"{{2},{2,1},{2,1,3},{2,1,3,4}}" [2, 1, 3, 4] "{{1,2,3},{2,1},{1,2,4,3},{2}}" [2, 1, 3, 4] "{{4,2,3},{3},{2,3,4,1},{2,3}}" [3, 2, 4, 1]

programmers.co.kr

안녕하세요 후르륵짭짭 입니다.

이번에 다룰 문제는 카카오 문제인 튜플 입니다.

저는 처음에 이 문제가 시간초과가 발생 할 줄 알고 걱정 했는데,

제출 하니 발생 하지 않아서 다행입니다.

 

 ** 문제 해결 방법 **

처음에는 문제가 이해가 안됐는데,,,, 튜플이 하나 일 때는, 맨 앞에 것이 주어지고

두개 일 때는, 튜플에 순서로 두개의 항목이 주어집니다.

따라서 이것을 보아 정렬해서 딕셔너리로 해결하면 풀 수 있겠구나 싶었습니다.

// 0 : 47
func solution(_ s:String) -> [Int] {
    
    let newS = s.components(separatedBy: "},").map { (element) -> String in
        return element.filter { (char) -> Bool in
            return char == "{" || char == "}" ? false : true
        }
    }.sorted { (ele1, ele2) -> Bool in
        return ele1.count < ele2.count
    }
    
    var dict : [Int : Int] = [:]
    var answer : [Int] = []
    
    for element in newS{
        
        let singleElement = element.components(separatedBy: ",").map { (element) -> Int in
            return Int(element)!
        }
        
        for single in singleElement {
            
            if dict[single] == nil {
                answer.append(single)
                dict[single] = single
            }
            
        }
        
    }
    
    return answer
}

처음에 모든 문자열을 "}," 을 기준으로 나눠줘서 배열을 만들어 주고 각 배열에 "}" 과 "{" 을 제거 해줍니다. 

그러면 이제 튜플만 남게 됩니다.

그리고 이제 각 배열의 원소 요소를 "," 을 기준으로 나눠주고 Int 형으로 만든 뒤에 

딕셔너리로 존재 여부를 판단 했습니다.

 

** 다른 사람의 코드 **

 nobleidea님의 코드입니다.

func solution2(_ s:String) -> [Int] {
    var result: [Int] = []

    var sets = s.split(omittingEmptySubsequences: true, whereSeparator: { "}".contains($0) }).map {
        $0.split(omittingEmptySubsequences: true, whereSeparator: { "{,".contains($0) }).map { Int($0)! }
    }

    sets.sort { (lhs, rhs) -> Bool in
        lhs.count < rhs.count
    }


    sets.forEach {
        result.append(Array(Set($0).subtracting(result)).first!)
    }

    return result
}

이 분의 코드를 보면 현재 비교할 요소를 Set으로 만들어주고 거기서 차집합을 했습니다.

developer.apple.com/documentation/swift/set/1783322-subtracting

 

Apple Developer Documentation

 

developer.apple.com

Set 클래스의 메소드인 subtracting 차집합을 하게 되면 

A.subtracting(B)를 하면 A에서 B와 동일한 요소를 제거 하고 남은 것들을 제공 해줍니다.

그래서 결국 정렬을 해줬기 때문에 한가지 요소만 남고 그 요소를 result 배열에 담아 줬습니다.

 

728x90
반응형

댓글