알고리즘 문제 풀이

[Swift] 프로그래머스 LV2. 튜플

lgvv 2022. 4. 1. 23:49

프로그래머스 LV2. 튜플

 

✅ 문제를 이해하기가 어려웠지 푸는데 어렵지는 않았음.

근데 왜 포스팅하냐면, 푸는데 오래걸려서.

정규 표현식으로 분리하려고 했는데, 사용하기가 불편했고, split을 통해서 "}"로 분리해서 작업을 했더니, 원하는 형태로 바꾸는데 for이 많이 들어가서 코드가 별로가 되었음.

 

근데 코드를 보니까 분리를 "},{"로 가능해 보여서 그렇게 설계함.

문제를 풀고난 후에 구글링을 하면서 코드 리팩토링까지 마침.

component와 split에 대해서 더 자세히 알아야겠다고 다짐하며 마침.

 

🟠 문제에서 이해가 가지 않는 부분 해석

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

{3}

{2,3}

{4,2,3}

{2,3,4,1}

이렇게 순서로 봐야한다.

처음에는 3이 있으니까 list에 3을 넣고

2번째에는 새로운 값이 2니까 2를 넣고 이렇게 반복

 

🟠 코드 설명

 

func solution(_ s:String) -> [Int] {
        var s = s
        s.removeFirst(2)
        s.removeLast(2)
        
        var list = [Int]()
        s.components(separatedBy: "},{")
            .map { $0.components(separatedBy: ",").map { Int($0)! } }
            .sorted { $0.count < $1.count }
            .forEach { elements in
                elements.forEach { element in
                    if !list.contains(element) {
                        list.append(element)
                    }
                }
            }
        
        return list
    }

문제에서 원소가 중복되지 않는다고 가정하였으므로 contain으로 찾아도 된다.

만약 중복이 있다면 for을 사용해서 firstIndex로 계속지워나가다가 nil일 경우 새로운 값임을 캡처해야한다.