swift 184

[Swift] BOJ 1766 문제집

BOJ 1766 문제집 이것도 위상정렬 문제. 위상정렬 알고리즘은 쉬운데 어느때에 사용해야할 지 판단하는게 중요 물론 위상정렬 알고리즘 포스팅에도 적어 두었지만, 방향 그래프의 모든 노드를 방향성에 거스르지 않도록 순서대로 나열하는 것'이다. 쉽게 말해서 선수과목 같은 조건이 있는 경우에 사용한다. 샘플 코드알고리즘은 줄 세우기 알고리즘과 같다.다만, queue를 sort해야하는 부분만 조금 다르며, queue의 경우에는 줄 세우기는 데이터가 커서 index로 접근하지만 이 문제에서는 removeFirst로 처리한다. //https://www.acmicpc.net/problem/1766import Foundationstruct b1766 { static func run() { // ..

SwiftUI Toast, popup

SwiftUI Toast, popup 오픈소스를 활용해서, 팝업 및 토스트 UI를 처리하는 부분을 기술.직접 구현해도 크게 어렵지 않으나, 개인 앱 개발 시 오픈소스를 활용함으로써 본질에 더 집중할 수 있다는 이점. 히스토리2022.05.23. 15:36초기 포스팅 PopupView 2점대 버전2024.11.18. 02:23PopupView 예제 개선 및 3점대 버전으로 재정리주의: 해당 오픈소스를 확장 개발하기 위해 PR 및 이슈를 검토하던 중, 메인테이너 분이 바쁘셔서 문제점을 다른 작업자의 PR을 고스란히 넣어주고 있음하지만, 개인 앱 개발에서 크리티컬한 문제가 되지 않아서 재정리 오픈소스 링크https://github.com/exyte/PopupView GitHub - exyte/PopupView..

[Swift] BOJ 4386 별자리 만들기

BOJ 4386 별자리 만들기 알고리즘은 크루스칼 알고리즘인데 간선의 정보를 직접 구해야 한다.간선의 정보를 다 구하려면 2중 for문을 거쳐야해서 이게 맞나 싶었는데, 데이터 수가 크지 않아서 가능했다. 크루스칼을 풀면서 자주 실수를 하는데, 그것은 크루스칼 알고리즘 쪽에 정리해 두었다. 샘플 코드 import Foundation let v = Int(readLine()!)! // 별의 갯수 var input: [[Double]] = [] // [x,y] 좌표들의 list var parent = Array(0...v) // // 2차원 배열로 세팅함. for _ in 0.. Int { if pa..

[Swift] BOJ 1197 네트워크 연결

BOJ 1197 네트워크 연결 최소 스패닝 트리의 기본적인 유형이다.find - union 과 최소 신장 트리를 찾는 크루스칼 알고리즘을 적절히 섞으면 된다. 근데, 이 알고리즘을 잘 이해하고 있지만 구현하는데 자잘한 실수를 해서 실수를 정리하고 한다.최소 스패닝 트리에서의 내 실수들1. union함수에서 num1, num2도 find함수를 통해서 해야한다. -> 자꾸만 난 parent[i] 로 세팅하는 실수를 범한다.2. parent의 개수를 지정할 때는 노드의 개수(정점의 수)만큼 지정해야 한다. -> 실수로 간선의 개수로 설정하기도 한다.3. 간선의 리스트를 세팅할 때는 정점의 개수가 아닌 간선의 개수로 해야한다. -> 이 문제는 이거 때문에 왜 안되지 이러고 있었다.4. 비용을 기준으로 오름..

[Swift] BOJ 1647 도시 분할 계획

BOJ 1647 도시 분할 계획 우선 나동빈 책에 있는 대표적인 유형크루스칼 알고리즘을 사용하면 쉽게 풀 수 있었지만, Swift를 사용하는 내게 시간초과라는 결과를 받음. 시간 초과 알고리즘 풀이 let firstLine = readLine()!.split(separator: " ").map { Int($0)! } var parent = Array(0...firstLine[0]) // 부모노드 생성 for i in 0...firstLine[0] { parent[i] = i }// print(parent) var edges = [(Int, Int, Int)]() // 시작, 끝, 비용 for _ i..

Swift 디자인패턴 Adapter Pattern (어댑터 패턴)

Swift 디자인패턴 Adapter Pattern (어댑터 패턴) Adapter Pattern은 서로 호환되지 않는 인터페이스를 가진 클래스들이 함께 동작할 수 있도록 중간 역할을 하는 구조 패턴.기존 코드를 변경하지 않고, 원하는 인터페이스를 갖춘 어댑터를 추가하여 두 시스템을 연결 히스토리2022-05-13: 디자인 패턴 스터디 정리2024-11-28: 포스팅 글 재정리 및 예제 변경 Adapter Pattern어댑터 패턴은 4가지 구성요소로 이루어져 있음클라이언트(Client):특정 인터페이스를 기대하며 동작하는 코드.타겟(Target): 클라이언트가 호출하려는 인터페이스.어댑터(Adapter): 타깃 인터페이스를 구현하여, 실제 서비스를 제공하는 어댑티(Adaptee)를 감싸는 객체.어댑티(Ada..

[Swift] BOJ 2143 두 배열의 합

BOJ 2143 두 배열의 합 난이도는 골드3인데 투포인터 + 이진탐색 영역이라고 좀 어려웠다.삼성 문제풀 때 시뮬레이션 푸는거랑 비슷해서 그냥 정확하게만 풀면 되겠다 싶음. [알고리즘 접근법] 1. 부분합(연속적이어야함) 을 A,B 배열을 찾는다.2. 정렬을 한 후에, 위 아래로 하나씩 보고 두 수를 더했을 때 찾는 수와 같다면 중복을 체크하여 validCase에 반영한다.3. 두 수가 더했을 때, 다르다면 그 크기를 체크하여 aIdx or bIdx를 옮긴다. 샘플 코드 let t = Int(readLine()!)! let n = Int(readLine()!)! let a = readLine()!.split(separator: " ").map { Int(St..

[Swift] BOJ 2805 나무 자르기

BOJ 2805 나무 자르기 나동빈 책에서 같은 논리로 푸는걸 보았는데, 쉽다고 생각했는데 안되었음. 내가 이 문제를 못 푼 이유가 있는데, 이게 나무가 정확히 m만큼 나온다고 생각했었음.이게 경우에 따라서는 m보다 더 가져갈 수 밖에 없을 수도 있음 반례4 820 15 10 1715일 때 -> result 714일 때 -> result 10 따라서 답은 14이지만 8보다는 많이 가져가면서 최소로 가져감. 이 로직이 가장 중요한 부분 샘플 코드 // 나무의 수 N, 상근이가 가져가려는 나무의 길이 M let input = readLine()!.split(separator: " ").compactMap{ Int(String($0))} let m = input[1] ..

[Swift] BOJ 12738 가장 긴 증가하는 부분 수열 3

BOJ 12738 가장 긴 증가하는 부분 수열 3 가장 기본적인 유형의 dp 문제. 알고리즘 접근법이진 탐색을 이용하였는데, C++에는 lower_bound를 제공해주어서 그런지, 이 부분을 따로 구현하지 않더라.진짜 Swift로 알고리즘 공부하는데 가장 힘든 것은 직접 전부 구현해야 하는 것들이 정말 많음 1. list의 마지막 값과 현재 값을 비교.2. 2-1. 현재 값이 list의 마지막 값보다 크다면 list의 끝에 현재 값을 대입 2-2. 현재 값이 list의 마지막 값보다 작다면 list를 거꾸로 순회 2-2-1. lowerBound를 통해서 나보다 작은 값의 index를 찾음. 2-3. lowerBound를 통해 찾은 list[index]를 현재 값으로..