티스토리 뷰
코딜리티의 데모 테스트의 문제는 이렇습니다.
저는 언어를 Swift4로 선택했습니다.
하하.
먼저 문제 해석 :)
N개의 정수 중 A배열이 주어지면 A에서 발생하지 않은 가장 작은 양의 정수를 리턴하세요.
예를 들어 A= [1,3,6,4,1,2]이면 함수는 5를 리턴해야 합니다.
A = [1,2,3]이면 함수는 4를 리턴해야 합니다.
A = [-1,-3]이면 함수는 1을 리턴해야 합니다.
블라블라 효율적인 알고리즘을 작성해주라.
N은 [1.. 100,000] 범위의 정수이며 A의 각 요소는 [-1,000,000.. 1,000,000]입니다.
일단 데모 테스트를 풀어보자.
핵심은 주어진 A배열에서 발생하지 않은 가장 작은 양의 정수를 리턴해야 합니다.
그냥 for문으로 1부터 A의 카운트만큼 돌려서 배열에 값이 포함되어있는지 확인하면 안될라나 생각했으나 시간복잡도가 O(n^2)이니 빠른 포기 . .
두 번째 방법을 찾아보자
일단 1부터 A의 카운트만큼 집합으로 만들어주고, 배열 A를 집합으로 만들어 subtracting을 한다.
즉 차집합을 이용하자.
알고리즘보다는 그냥 집합의 특징을 이용해 문제를 풀어봅니다. .
public func solution(_ A : inout [Int]) -> Int {
let answer = Set(1...A.count).subtracting(Set(A)).sorted()
if let ans = answer.first {
return ans
} else {
return A.count + 1
}
}
다시 말해 A에 포함되지 않은 숫자를 정렬해주고 최솟값을 가져오는 작업을 처리했습니다.
answer에 값이 있다면 정렬된 것의 첫 번째 즉 제일 작은 수를 리턴하고
answer에 값이 없다면 A.count + 1을 리턴하도록 해줍니다.
그림으로 예를 들어 A= [1,3,6,4,1,2]이면 함수는 5를 리턴해야 합니다.
왼쪽 동그라미는 Set(1... A.count)이고 오른쪽은 Set(A)입니다.
위 코드에서 subtracting을 해줌으로 인해 왼쪽에서 오른쪽을 빼줍니다.
그럼 결과적으로 5가 남게 됩니다.
answer에는 (5) 값이 존재하니 5를 리턴해주게 됩니다.
// 이 예제는 5만 남게 되었는데 두 개 이상이 남게 될 경우에는 정렬한 것의 첫 번째 값을 가져오면 최솟값을 가져올 수 있습니다.
이렇게 코드를 채점하니
통과
결과적으로 시간 복잡도는 O(n)이나 O(nlog(n))을 가지게 됩니다.
'Tech > Algorithm' 카테고리의 다른 글
버블 정렬 bubblesort with swift (0) | 2019.09.05 |
---|---|
삽입 정렬 insertionsort with swift (0) | 2019.09.04 |
선택 정렬 selectionsort with swift (0) | 2019.09.04 |
스택 두개로 큐 만들기 (0) | 2019.07.16 |
단순 연결리스트 역순으로 출력하기 (2) | 2019.07.15 |
- Total
- Today
- Yesterday
- swift5
- Deep learning
- 알고리즘
- SWIFT
- 머신러닝
- leetcode
- ios
- stanford SwiftUI
- 책 후기
- string
- RX
- 독서
- 책
- Xcode
- objc
- 스위프트
- ARC
- swiftUI
- Animation
- 문자열
- 스위프트UI
- rxswift
- Algorithm
- wwdc
- iOS SwiftUI
- objective-c
- 애니메이션
- 책 추천
- 딥러닝
- ReactiveX
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |