본문 바로가기

전체 글

(258)
[Combine] ObservableObject, @StateObject, @ObservedObject, @EnvironmentObject SwiftUI는 선언형 UI 프레임워크로, 데이터가 변경되면 뷰가 자동으로 업데이트되는 '데이터 바인딩'이 핵심입니다.String, Int 같은 값 타입(Struct, Enum)은 @State나 @Binding을 사용해 간단히 상태를 관리할 수 있습니다. 아래 포스팅에서 @State와 @Binding에 대한 내용이다. [SwiftUI] Managing user interface state이 문서의 글을 번역하여 글을 작성하였습니다. Managing user interface state | Apple Developer DocumentationEncapsulate view-specific data within your app’s view hierarchy to make your views reusable...
[Swift] for문 역으로 순회방법 코테를 풀다가 갑자기 for문을 역순으로 사용 해야 되는 경우가 생겼는데 문득 갑자기 어떻게 써볼지 몰라 당황하여 정리하기 위해 포스팅한다. 간단하게는 두 가지를 소개하려고 한다. stride(from:to:by:) 함수 사용 stride(from:to:by:) | Apple Developer DocumentationReturns a sequence from a starting value to, but not including, an end value, stepping by the specified amount.developer.apple.com stride(from:to:by:) 또는 stride(from:through:by:) 함수를 사용하여 특정 범위에서 일정한 간격으로 역순으로 반복from은 시..
[AutoLayout] Compression Resistance Priority Compression Resistance Priority Hugging Priority는 뷰가 자기 크기보다 늘어나지 않으려고 하는 우선순위라고 하면은 Compression Resistance Priority는 뷰가 자기 크기보다 줄어들려고 하지 않는 우선순위이다. 값이 높을수록 글자가 잘리거나 압축되는 걸 거부하고 자기 크기를 유지하려고 한다. Hugging Priority는 아래 포스팅을 참고 [AutoLayout] Hugging Priority우리가 UILabel이 두 개인 상황이다.내가 왼쪽 UILabel은 top/leading/trailling을 40씩, 그리고 오른쪽 UILabel 또한 40씩으로 설정해놓았다.그런데 왼쪽 텍스트가 길어져서 위 에러 메세지가 발생하였다.Set hkimkhuna9..
[Swift] Dynamic Programming (동적 계획법) DP(Dynamic Programming; 동적 계획법)큰 문제를 작은 문제로 쪼개어 푸는 알고리즘 기법으로 이미 계산한 작은 문제의 정답을 저장(메모이제이션) 해 두고, 필요할 떄 재사용하여 중복 계산을 방지해서 효율적이다. 대표적으로 경로탐색, 최적화(최대/최소/방법 수), 조합 문제 등에서 사용할 수 있다.대표적인 예로 피보나치 수열을 풀어볼려고 한다. 우선 기존에는 대표적인 재귀함수 문제로 재귀함수로 코드를 구현했다.func fibRecursive(_ n: Int) -> Int { if n 이것도 문제를 풀 수 있지만 n이 커지면 연산량이 많아지고, 현재 같은 계산을 계속 반복하고 있어 시간이 오래 걸린다.연산을 했던 것을 저장하여 저장된 것이 있다면 꺼내서 사용하는 DP 알고리즘으로 구현..
[Swift] BFS (너비 우선 탐색) BFS(너비 우선 탐색) 시작 정점을 방문 한 후 시작정점에 인접한 모든 정점들을 우선 방문한다. DFS와 다른 점은 DFS는 탐색하기 위해 원소를 최대한 깊게 따라가야하지만 BFS는 현재 인접한 노드를 먼저 방문해야한다. 이것은 인접한 노드 중 방문하지 않은 모든 노드를 저장해두고, 가장 처음에 넣은 노드를 꺼내서 탐색하면 된다. 이것은 FIFO(First In First Out) 구조를 가진 큐를 이용하면 된다. func bfs(graph: [Int: [Int]], startNode: Int) -> [Int] { var visited: [Int] = [] var queue: [Int] = [startNode] while !queue.isEmpty { let curr..
[Swift] DFS(깊이 우선 탐색) DFS(깊이 우선 탐색) DFS(Depth-First Search)는 트리나 그래프 구조에서 하나의 경로를 가능한 깊게 먼저 탐색한 후 다른 경로로 이동하는 알고리즘 이다.갈 수 있는 만큼 계속 탐색하다가 갈 수 없게 된다면, 다른 방향으로 다시 탐지하는 구조이다. 이 구조는 LIFO(Last In Frist Out) 구조인 Stack과 같다. 이 코드를 Swift로 구현해보았다. 쉽게 이해해서 방문하지 않은 곳은 계속 찾아가면 된다. func dfs(graph: [Int: [Int]], currentNode: Int) -> [Int] { var visited: [Int] = [] var willVisit: [Int] = [currentNode] for node in graph[c..
[CS] 그래프(Graph) 그래프(Graph)그래프는 노드(정점, Vertex)와 간선(edge)으로 구성된 비선형 자료 구조이다. 복잡하게 연결된 객체 간의 관계를 표현할 때 사용한다. 아래는 그래프에서 사용하는 용어들이다.노드(Node) : 연결 관계를 가진 각 데이터를 의미, 정점(Vertext)라고도 한다.간선(Edge) : 노드 간의 관계를 표시한 선인접 노드(Adjacent Node) : 간선으로 직접 연결된 노드(또는 정점) 무방향(Undirected) vs 양방향(Directed)그래프에는 무방향 그래프와 유방향 그래프가 있다. 무방향 그래프(Undirected Graph)는 방향이 없는 간선을 갖고 있고, 유방향 그래프(Directed Graph)는 방향이 있는 간선을 갖는다. 간선은 단방향 관계를 나타내며, 각..
[Swift] 힙(Heap) 힙(Heap)힙은 데이터에서 최대값과 최소값을 빠르게 찾기 위해 고안된 완전 이진 트리(Complete Binary Tree) 구조이다.부모의 값은 항상 자식들의 값보다 크거나(Max Heap), 항상 자식들의 값보다 작거나(Min Heap)이여야 한다. 아래는 Max Heap을 구현해 보았다.public struct MaxHeap { public private(set) var elements: [T] = [] public init() {} public mutating func insert(_ element: T) { elements.append(element) var i = elements.count - 1 while i > 0 { ..