반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 "프로그래머스(Lv.2) - 튜플" 문제를 풀었습니다.
Github
문제 링크
풀이
이번 문제는 문자열 처리, 배열 문제입니다.
카카오 문제 중에서는 쉬운 문제 축에 드는 것 같습니다.
튜플 문제의 input은 평소처럼 배열이 아니라 String입니다. 즉, 직접 parsing을 해서 사용을 해야 합니다.
제가 문자열 처리라고 생각한 이유가 이것 때문입니다.
제가 선택한 방법은 이렇습니다.
- dropLast(), dropFirst()를 이용해 앞 뒤 두 글자씩 자릅니다.
앞에서는 {{, 뒤에서는 }}가 잘립니다. 그러면 },{를 기준으로 문자열을 자를 수 있습니다. - componets(separatedBy:)를 이용해 },{를 기준으로 문자열을 자릅니다.
- 2번에서 자른 문자열 배열을 , 기준으로 자르고 Int 변환합니다. [[Int]]를 얻게 됩니다.
- 3번에서 나온 결과물을 길이를 기준으로 오름차순 정렬합니다.
길이가 1인 집합을 이용하여 튜플의 시작을 알 수 있습니다.
{2}를 가진 집합은 2로 시작하는 튜플임을 나타냅니다.
길이가 2인 집합에서 이미 추가한 원소를 제외하면 두 번째 순서의 튜플 원소를 알 수 있습니다.
같은 원리로 길이가 3인 집합에서는 세 번째 튜플 원소를 알 수 있습니다.
이를 위해 4번에서 길이로 오름차순 정렬을 한 것입니다.
이미 추가했는지 체크하는 것은 Bool 배열을 미리 만들어 빠른 참조가 가능하도록 하였습니다.
감사합니다!
전체 코드
import Foundation
func solution(_ s:String) -> [Int] {
var result: [Int] = []
var added: [Bool] = Array(repeating: false, count: 1000000 + 1)
let numbers = String(s.dropLast(2).dropFirst(2)).components(separatedBy: "},{") //[String] 파싱
.map { numberStr in numberStr.split { $0 == "," }.map { Int(String($0))! } } //[[Int]] 파싱
.sorted { $0.count < $1.count } //길이로 정렬
for number in numbers {
for n in number {
if !added[n] {
result.append(n)
added[n] = true
}
}
}
return result
}
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형