알고리즘 풀 때 자주 쓰는 몇가지 테크닉
글 작성자: HEROHJK
1. 배열 순회중, 오버플로우 체크
if (0 ..< arr.count).contains(i) {
arr[i] =
}
2. N ~ M까지 순회가 필요할 때
(N ... M).forEach {
$0
}
3. 나머지가 0인지 아닌지 판별할 때
소수 판별이나 비슷한 문제에서, N까지 순회하지 마시고, N / 2 까지만 순회하세요.
N/2를넘어가게되면 나머지값이 0이 나올 수 없습니다.
그리고 개인차긴한데, 0혹은 1부터 시작하지말고, 2부터 시작하는게 자신이 생각하는 논리에 조금 더 근접하다고 느껴집니다.
func isPimeNumber(at: Int) -> Bool {
for number in 2 ... at / 2 {
if at % number == 0 { return false }
}
return true
}
4. 2개의 배열을 연관지어 처리할 때
zip 함수를 이용합니다.
func mergeArray(arr1: [String], arr2: [String]) -> [String] {
return zip(arr1, arr2).map { "\($0)\($1)" } // ["A1", "B2", "C3", "D4", "E5"]
}
print(mergeArray(arr1: ["A", "B", "C", "D", "E"], arr2: ["1", "2", "3", "4", "5"]))
5. 배열들을 합칠 때
reduce를 이용합니다.
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(arr.reduce(0, +)) //55
6. 배열의 일부만 이용하고자 할 때
func arraySum(_ arr: [Int], _ left: Int, _ right: Int) -> Int {
return arr[left ... right].reduce(0, +)
}
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(arraySum(arr, 2, 5)) // 18
7. 진법 변환
실제로 코테에서 이걸 허락할지는 모르겠는데, 아주 간단하게 변환이 가능합니다.
(연습을 하는 목적이라면 직접 구현하는 코드를 테스트하는 의도이기 때문에 추천하지는 않습니다..)
(2 ... 16).forEach {
print("\($0)진법:")
print(String(10, radix: $0))
}
/*
2진법:
1010
3진법:
101
4진법:
22
5진법:
20
6진법:
14
7진법:
13
8진법:
12
9진법:
11
10진법:
10
11진법:
a
12진법:
a
13진법:
a
14진법:
a
15진법:
a
16진법:
a
*/
8. 배열을 Stack or Queue 처럼 사용하기.
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
// 스택처럼 사용 (후입선출)
if let last = arr.popLast() { // 배열에 인자가 없을 경우 nil 반환
arr.append(last)
}
// 큐처럼 사용 (선입선출)
let first = arr.removeFirst()
arr.append(first)
/// 하지만 인자가 없을 때 removeFirst를 하면 오버플로우가 발생하므로
/// 코딩테스트에서는 count 체크를, 실제 코딩에서는 extension을 만들어 사용하는것을 추천
if arr.count > 0 {
let first = arr.removeFirst()
print(first)
}
extension Array {
mutating func safeRemoveFirst() -> Element? {
if self.count > 0 {
return self.removeFirst()
} else {
return nil
}
}
}
arr = [1]
if let first = arr.safeRemoveFirst() {
print(first)
}
생각나는대로 또 나중에 적어볼께요
반응형
댓글
이 글 공유하기
다른 글
-
UIColor Custom
UIColor Custom
2022.05.11 -
배열의 값으로 index를 찾기.
배열의 값으로 index를 찾기.
2022.04.11 -
RxSwift 결합 함수 정리
RxSwift 결합 함수 정리
2021.07.04 -
addSubview 한번에 하기
addSubview 한번에 하기
2021.06.03