알고리즘/프로그래머스

프로그래머스 - 튜플

leeyuno 2021. 1. 22. 16:43

programmers.co.kr/learn/courses/30/lessons/64065?language=swift

 

코딩테스트 연습 - 튜플

"{{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

 


반복문을 돌려서 {} 안의 숫자를 찾은다음

 

나온 배열을 길이 순서대로 정렬한다음 새로운 숫자를 한개씩 결과 배열에 담음

 

 

예제 1번 "{{2},{2,1},{2,1,3},{2,1,3,4}}"을 예를들면

 

반복문을 돌리면 [[2], [2, 1], [2, 1, 3], [2, 1, 3, 4]] 로 바뀌고

 

길이순으로 정렬해서 새로운 숫자를 한개씩 담으면

  숫자배열 결과배열
1 [2] [2]
2 [2, 1] [2, 1]
3 [2, 1, 3] [2, 1, 3]
4 [2, 1, 3, 4] [2, 1, 3, 4]

 

이런식으로 결과배열에 없고 숫자배열에만 있는 수를 한개씩 더함

 

최종코드

 

func solution(_ s:String) -> [Int] {
    var temp_s = s
    temp_s.removeFirst()
    temp_s.removeLast()
    
    var array = [[Int]]()
    
    //{에서 }까지 안의 숫자를 잘라서 배열에 담기를 반복
    while temp_s.contains("}") {
        array.append(temp_s[temp_s.index(after: temp_s.firstIndex(of: "{")!) ..< temp_s.firstIndex(of: "}")!].split(separator: ",").map { Int($0)! })
        temp_s.removeSubrange(temp_s.firstIndex(of: "{")! ... temp_s.firstIndex(of: "}")!)
    }

    array = array.sorted { $0.count < $1.count }

    var result = [Int]()

	//배열을 길이 순서로 정렬한 다음 한개씩 결과배열에 담음
    for a in array {
        if result.isEmpty {
            result.append(a[0])
        } else {
            for aa in a {
                if !result.contains(aa) {
                    result.append(aa)
                }
            }
        }
    }
    return result
}

 

다풀고 다른분의 풀이를 보고 방법은 같은데 더 좋은 코드를 찾았다.

 

문자열을 숫자배열로 전환하는 코드

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

 

길이별로 정렬한 배열에 한개씩 새로운 숫자를 더하는 코드

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