프로그래머스- 43

김정현·2023년 6월 14일
0

프로그래머스

목록 보기
43/46

문제 설명

셀수있는 수량의 순서있는 열거 또는 어떤 순서를 따르는 요소들의 모음을 튜플(tuple)이라고 합니다. n개의 요소를 가진 튜플을 n-튜플(n-tuple)이라고 하며, 다음과 같이 표현할 수 있습니다.
(a1, a2, a3, ..., an)
튜플은 다음과 같은 성질을 가지고 있습니다.
중복된 원소가 있을 수 있습니다. ex : (2, 3, 1, 2)
원소에 정해진 순서가 있으며, 원소의 순서가 다르면 서로 다른 튜플입니다. ex : (1, 2, 3) ≠ (1, 3, 2)
튜플의 원소 개수는 유한합니다.
원소의 개수가 n개이고, 중복되는 원소가 없는 튜플 (a1, a2, a3, ..., an)이 주어질 때(단, a1, a2, ..., an은 자연수), 이는 다음과 같이 집합 기호 '{', '}'를 이용해 표현할 수 있습니다.
{{a1}, {a1, a2}, {a1, a2, a3}, {a1, a2, a3, a4}, ... {a1, a2, a3, a4, ..., an}}
예를 들어 튜플이 (2, 1, 3, 4)인 경우 이는
{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
와 같이 표현할 수 있습니다. 이때, 집합은 원소의 순서가 바뀌어도 상관없으므로
{{2}, {2, 1}, {2, 1, 3}, {2, 1, 3, 4}}
{{2, 1, 3, 4}, {2}, {2, 1, 3}, {2, 1}}
{{1, 2, 3}, {2, 1}, {1, 2, 4, 3}, {2}}
는 모두 같은 튜플 (2, 1, 3, 4)를 나타냅니다.
특정 튜플을 표현하는 집합이 담긴 문자열 s가 매개변수로 주어질 때, s가 표현하는 튜플을 배열에 담아 return 하도록 solution 함수를 완성해주세요.

대충 해석하자면 원소가 {} 안에 한가지 원소만 있는 거부터 차례대로 [] 내부에 첫번째 원소가 되며 그리고나서 두가지 원소, 세가지 원소 해서 숫자의 순서를 맞춘 튜플을 찾아내라는 문제 같다.

우선 {}안에 갯수에 따라 차곡차곡 배열안에 담기만하면 되는 문제이긴하다.
그러려면 {} 을 기준으로 이차원배열로 바꾼뒤 for문을 활용하는게 제일 괜찮아 보인다.

많이 찾아본 결과 저런식으로 스트링을 기준으로 이차원배열이나 단순 문자를 기준으로 배열로 바꾸기 위해선

let twodimensionS = try? JSONDecoder().decode([[Int]].self, from: Data(S.utf8))

이런식으로 JSONDecoder을 이용할 필요가 있어보인다. 우선, 선행 조건으로 문자열에 {} 을 []로 변환해야하고 그리고 나서 이걸 문법으로 변환하는 형식이다.

그 다음에 for문을 활용해 해결할 생각이었는데,

for i in twodimensionS!{
        if i.count == 1 {
            result.append(i[0])
        }
    }

첫번째 원소까지는 해결됐다쳐도 2, 3, 4... 500까지의 숫자를 모두 if문으로 처리할 수도 없을 뿐더러, 두 번째부터는 첫번째 원소를 제외하고 추가해야하고 그런 과정을 처리할 엄두가 나질 않았다.

방법을 바꾸기로 했다. 그냥 하나의 배열로 만들고 숫자의 갯수에 따라 담는 방식이다. 이게 훨씬 간단할 것 같다.

도저히 해결할수 없어 다른사람의 풀이를 보았다.

import Foundation

func solution(_ s:String) -> [Int] {

    let answer = s.components(separatedBy: ["{","}"]).filter { $0 != "" && $0 != ","}.sorted(by: {
        $0.count < $1.count
    }).reduce([String]()) {
        var result = $0
        result.append(contentsOf: Set($1.components(separatedBy: ",")).subtracting(Set($0)))
        return result
    }
    return answer.map { Int(String($0))! }
}

대부분 공통적으로 set을 활용했다. 각색의 방법으로 배열로 변경한뒤, Set을 활용해 차집합을 구하고 그걸 문자열로 변환하고를 반복하여 답안을 내렸다.
두고두고 이 문제는 한번씩 풀어보려고 노력해봐야겠다.

0개의 댓글