728x90
https://blog.naver.com/boostcamp_official/223085597916
네이버 부스트캠프에 있는 문제를 풀어봤다.
풀이1
func solution1(_ arr: [Int]) -> [Int] {
var result = [Int]()
// 배열에 요소가 1개이면 중복이 없음.
if arr.count > 1 {
let arr = arr.sorted()
var count = 1
for i in 1..<arr.count {
// 이전 배열과 같으면 count + 1
if arr[i-1] == arr[i] {
count += 1
} else {
// 이전 배열과 다르면 count 초기화
count = 1
}
result.append(count)
}
// 중복횟수 외에는 1로 초기화
for j in 1..<result.count {
if result[j-1] < result[j] {
result[j-1] = 1
}
}
// 중복횟수로만 재배열
result = result.filter { $0 != 1 }
}
return result.count > 0 ? result : [-1]
}
Dictionary보다 Array가 익숙해서 Array를 활용해 풀었다.
arr의 element의 전후 비교를 통해 중복횟수를 count하고
중복된 값만 재배열하여 값을 출력했다.
아래 풀이는 for문을 1번만 사용하고 싶어서 조금 수정해봤는데, (사실 filter에도 for문이 있는것과 같기에 3번에서 2번으로 줄인 것)
풀이2
func solution2(_ arr: [Int]) -> [Int] {
var result = [Int]()
if arr.count > 1 {
let arr = arr.sorted()
var count = 1
for i in 1..<arr.count {
if arr[i-1] == arr[i] {
count += 1
if i == (arr.index(before: arr.endIndex)) {
result.append(count)
}
} else {
if count > 1 {
result.append(count)
}
count = 1
}
}
result = result.filter { $0 != 1 }
}
return result.count > 0 ? result : [-1]
}
순서에 상관없다고 생각하면, 아래와 같은 풀이가 가능하다.
결과값이 어떤 순서로 정렬되어야한다는 조건이 없어 조금 모호한 감이 있다.
예제에서는 작은 수부터 큰수로 정렬된 것으로 보이지만, 수의 크기와 상관없이 동시에 등장한 값 순서로 정렬되었다고 해석할 여지가 있다.
풀이3
func solution3(_ arr: [Int]) -> [Int] {
var dict = [Int: Int]()
for n in arr {
if dict[n] != nil {
dict[n]! += 1
} else {
dict[n] = 1
}
}
return dict.values.filter{$0 != 1}
}
속도로만 따졌을 때는 3번 풀이가 가장 빠를 것이다.
array를 인덱스로 접근하게 되면 속도는 O(k)일테지만, dictionary는 Key값으로 접근하기에 O(1)이기 때문이다.
또 메모리관점에서도 큰 차이는 없겠지만 3번풀이가 가장 효율적이다.
반응형
'🐣 알고리즘' 카테고리의 다른 글
[프로그래머스] Swift - 가장 큰 수(LV.2) (0) | 2023.06.04 |
---|---|
[프로그래머스] Swift - H-Index (LV.2) (0) | 2023.06.04 |
[프로그래머스] Swift - 햄버거 만들기(LV.1) (0) | 2023.06.02 |
[프로그래머스] Swift - [1차] 다트게임 (LV.1) (0) | 2023.06.01 |
[프로그래머스] Swift - 두수의 합(LV.0) (0) | 2023.05.31 |
댓글