본문 바로가기
Problem Solving

[Swift] 프로그래머스 튜플(lv. 2)

by DuncanKim 2023. 3. 23.
728x90

[Swift] 프로그래머스 튜플(lv. 2)

 

1. 문제

https://school.programmers.co.kr/learn/courses/30/lessons/64065

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

2. 접근

 

주어진 문자열 s를 잘게 분해해서 원래 표현하려고 했던 튜플을 만들어나가는 문제이다.

처음 문제를 보았을 때, 이해가 잘 되지는 않았지만 순서와 중복에 주의하면서 풀어나가야 겠다는 실마리를 잡을 수 있었다.

 

주어진 예제 결과 (2, 1, 3, 4)를 보면 이해가 조금은 더 쉽다.

{(2), (2, 1), (2, 1, 3), (2, 1, 3, 4)}와  {(1, 2, 3), (2, 1), (1, 2, 4, 3), (2)}가 같다...?

이는 원소의 순서가 바뀌어도 같은 튜플을 가리키는 n-튜플이라는 소리!

 

부분 튜플의 원소의 개수가 작은 것부터 결과 튜플에 넣어주면서 완성된 튜플을 만들어나가면 된다는 이야기이다.

 

{(1, 2, 3), (1, 2), (2, 1, 4, 3), (2)}도 똑같이 (2, 1, 3, 4)로 나올 것이다.

처음엔 네 번째 튜플 (2)   ----------- 결과 튜플 (2)

그 다음엔 두 번째 튜플 (1, 2)  ------- 결과 튜플 (2, 1)

그 다음엔 첫 번째 튜플 (1, 2, 3)  ---- 결과 튜플 (2, 1, 3)

마지막엔 세 번째 튜플 (2, 1, 4, 3) --- 결과 튜플 (2, 1, 3, 4)

 

이렇게 결과 튜플을 만들어나가는 것이라고 이해를 하고 문제를 풀었다.

 

아래 코드에서는 크게 두 부분으로 나누어 문제를 풀어보았다.

주어진 문자열 s를 분해하고 들어가 있는 숫자를 정수화하여 배열에 담아놓는 반복문을 먼저 돌린 후에

그 다음 그것들이 모여 있는 튜플들을 배열 크기 순으로 정렬한 후 결과 튜플을 조립하여 리턴하는 부분으로 나누었다.

 

tempString과 tempArray를 만들어서 각 튜플을 배열화 하여 tuple이라는 이차원 배열에 담고자 했다.

 

배열에 담아 놓는 것이 조금 복잡하긴 한데, 크게 네 가지로 분기하였다.

 

(1) 문자열이 "," 인 경우
-> 그 동안 정수가 모인 tempArray를 tuple 배열에 삽입함.

(2) 문자열이 숫자로 변환할 수 있는 경우
-> tempString에 문자열을 추가한다. 숫자가 십의 자리 수 일수도 있기에 문자열을 더 하는 방식으로 접근하였다.

(3) 문자열이 여는 중괄호인 경우
-> tempArray가 비어있는지 확인하고, 비어있지 않다면 tuple에 tempArray를 추가하고 tempArray를 빈 배열로 만든다.
-> 닫는 중괄호인 경우 코드를 짜기 귀찮아서 이렇게 해버렸다.

(4) 문자열이 닫는 중괄호인 경우
-> 대부분 코드가 (3)에 가있기 때문에 이 부분은 문자열의 마지막 "}}" 를 처리하기 위한 부분으로 두었다.

 

이런 식으로 tuple 배열을 만들고, 배열의 크기를 기준으로 하여 오름차순으로 tuple을 배열해주었다.

그런 다음, 하나씩 정답 배열에 넣는데, 중요한 것은 중복되는 원소들을 모두 제거한 후에 answer 배열 끝에 넣어야 한다는 것이다.

 

자신보다 크기가 작은 부분 튜플에서 나온 원소를 제외하고 answer 배열 끝에 append를 하는 방식으로 answer를 만든다음 리턴을 해주었다.

 

++ (반성)

사실 코드적으로 보면 굉장히 복잡하기도 하고, 제어문을 처리할 때, (3)과 (4)의 역할을 제대로 분할을 하지 않았다는 점이 더 혼란을 가중시킨 것 같다. 정확한 의도와 코드 작성을 해야 겠다는 생각을 할 수 있었다.

 

 

3. 코드

import Foundation

func solution(_ s:String) -> [Int] {
    var answer = [Int]()
    var tuple = [[Int]]()
    var tempArray = [Int]()
    var tempString: String = ""
    for (index, i) in s.enumerated() {
        if i == "," {
            tempArray.append(Int(tempString)!)
            tempString = ""
        } else if i.isNumber {
            tempString += String(i)
        } else if i == "{" {
            if !(tempArray.isEmpty) {
                tuple.append(tempArray)
                tempArray = [Int]()
            }
        } else {
            if index == s.count - 2 {
                tempArray.append(Int(tempString)!)
                tempString = ""
            } else if index == s.count - 1{
                tuple.append(tempArray)
            }
        }
    }
    
    tuple.sort(by: { $0.count < $1.count })
    for i in 0 ... tuple.count - 1 {
        let temp1 = Set(answer)
        let temp2 = Set(tuple[i])
        let resultNumberSet: [Int] = Array(temp2.subtracting(temp1))
        answer.append(resultNumberSet[0])
    }
    return answer
}
728x90

댓글