- 문제 제목을 클릭하면, GitHub 코드로, ✏️를 클릭하면 티스토리로 이동합니다.
- 코딩테스트 연습 (백준, 프로그래머스 등)
알고리즘
- 수학
자료구조
- 순서가 있는 임의의 집합, n개 중 r개를 뽑는 방법
var v = [1, 2, 3]
func permutation(n: Int, r: Int, depth: Int) {
if r == depth {
print( v.map { String($0) }.joined(separator: " "))
return
}
for i in depth..<n {
v.swapAt(i, depth)
permutation(n: n, r: r, depth: depth + 1)
v.swapAt(i, depth)
}
return
}
permutation(n: 3, r: 3, depth: 0)
- 순서가 없는 임의의 집합, n개 중 r개를 뽑는 방법
- 재귀함수 이용
var v = [1, 2, 3]
func permutation(n: Int, r: Int, depth: Int) {
if r == depth {
print( v.map { String($0) }.joined(separator: " "))
return
}
for i in depth..<n {
v.swapAt(i, depth)
permutation(n: n, r: r, depth: depth + 1)
v.swapAt(i, depth)
}
return
}
permutation(n: 3, r: 3, depth: 0)
- 반복문 사용
let n = 5, r = 3, a = [1, 2, 3, 4, 5]
// r=3이므로 3중 for문 -> r이 작을 때에만 반복문을 사용하자
for i in 0..<n {
for j in i+1 ..< i {
for k in j+1 ..< j {
print("\(i), \(j), \(k)
}
}
}
// 순서만 다를 뿐
for i in 0..<n {
for j in 0..<i {
for k in 0..<j {
print("\(i), \(j), \(k)
}
}
}
func gcd(_ a: Int, _ b: Int) -> Int {
if b == 0 { return a }
return gcd(b, a%b)
}
func gcd(_ a: Int, _ b: Int) -> Int {
if b == 0 { return a }
return gcd(b, a%b)
}
func lcm(_ a: Int, _ b: Int) -> Int {
return a * b / gcd(a, b)
}
- 에라토스테네스의 체(n <= 1,000,000)
func primeNumbers(_ n: Int) -> [Int] {
var numbers = [Bool](repeating: true, count: n+1)
var result = [Int]()
for i in 2...n {
if numbers[i] {
for j in stride(from: i*2, to: n, by: i) {
numbers[j] = false
}
}
}
for i in 2...n {
if numbers[i] { result.append(i) }
}
return result
}
func primeNumbers(_ n: Int) -> Set<Int> {
var numbers = Set(2...n)
for i in 2...n {
if numbers.contains(i) {
numbers.subtract(Set(stride(from: i*2, to: n, by: i)))
}
}
return numbers
}
- 제곱근 활용
func isPrimeNumber(_ n: Int) -> Bool {
if n < 2 { return false }
if n == 2 { return true }
if n % 2 == 0 { return false }
for i in 2...n {
**if !(i * i <= n) { break }**
if n%i == 0 { return false }
}
return true
}
**import Foundation**
func isPrimeNumber(_ n: Int) -> Bool {
if n < 4 { return n >= 2 }
if n % 2 == 0 { return false }
for i in 2...**Int(sqrt(Double(n)))** {
if n % i == 0 { return false }
}
return true
}
var cards = [0]
var prefix = [0]
let input = readLine()!.split(separator: " ").map { Int($0)! }
let (n, m) = (input[0], input[1])
cards.append(contentsOf: readLine()!.split(separator: " ").map { Int($0)! })
for i in 1...n {
prefix.append(cards[i] + **prefix[i-1]**)
}
for _ in 1...m {
let index = readLine()!.split(separator: " ").map { Int($0)! }
let (a, b) = (index[0], index[1])
print(prefix[b] - prefix[a-1])
}
print([1, 2, 3, 4, 5, 6].prefix(3))
- Swift의 배열 자체를 Stack처럼 사용하는 것이 베스트인듯! (굳이 만들 필요 없을 것 같다.)
- 삽입 삭제 모두 O(1)
struct Stack<T> {
private var stack: [T] = []
var count: Int {
stack.count
}
var isEmpty: Bool {
stack.isEmpty
}
var peek: T? {
stack.last
}
mutating func push(_ element: T) {
stack.append(element)
}
mutating func pop() -> T? {
stack.popLast()
}
}