전체 글

· → Outline
🧐 문제 상황경로가 그려지지 않는 상황watchOS에서 경로가 그려지지 않는 문제가 발생했다. ☠️ Outline 앱에서 가장 중요한 경로가 그려지지 않는다는 것은 큰 문제였다...사실 문제는 간단하게 해결이 가능했다. 바로 iOS, watchOS에서 공통으로 쓰는 LocationManager의 startUpdate()라는 메서드를 watchOS에서 호출하지 않아서 생긴 문제였다.  분명 이전에는 잘 작동했는데... iOS앱에서 변경사항이 생기자 그것이 watchOS앱까지 영향이 가버린 Side Effect 즉, 부작용이라고 생각되었다.리팩토링의 필요성 ♻️이전에는 공통으로 쓰이는 메서드들이 많다보니 시간이 부족하기도 하고, 큰 생각없이 당연하게 Target Membership을 iOS, watchOS..
· → Outline
🧐 문제 상황Smooth 알고리즘 문제점 발견아래와 같이 Smooth 적용 후 크지 않은 경로는 아래와 같이 조금 뭉개지는 현상과 처음과 끝이 연결되지 않는 상황이 발생했다!💡 해결 과정기존 로직 뜯어보기기존의 코드를 살펴보았다. 내가 봐야할 부분은 마지막이 연결이 안되는 부분과 라인이 뭉개지는 이유였다. private func smoothLocations(_ locations: [CLLocationCoordinate2D]) -> [CLLocationCoordinate2D] { guard locations.count > 1 else { return locations } var smoothed: [CLLocationCoordinate2D] = [] ..
· → Outline
🧐 문제 설명1. 썸네일의 URL 불러오기썸네일이 Firebase와 같은 외부 저장소에 URL 형태로 저장되어, 불러올 때마다 네트워크 비용이 증가하고 여러 썸네일을 불러올 때 앱의 응답성에 안좋은 영향을 미칠 위험이 있다.이미지 경로를 직접 하드코딩하여 사용하는 방식은 이미지 경로를 변경하거나 파일 위치를 수정할 때마다 코드 전반에서 수정을 해야 하기 때문에 유지보수성이 떨어질 것으로 예상된다.2. RecordView, CardView에서 지도 로드 문제현재의 구현 방식은 지도를 반복적으로 렌더링하여 리소스를 소비하고 있었다. 이러한 비효율성은 앱의 성능 저하와 리소스 낭비로 이어지며, 특히 저사양 기기에서 더 큰 문제를 일으킬 수 있다고 판단했다.또한 실제로 실 기기 사용시 아래의 그림처럼 러닝 횟..
· → Problems
문제 소개월요일을 기념하며... 약간은 풀만한 문제(?)에 도전했다..! 문제에 친절하게도 재귀적으로 방문한다는 힌트가 있다! 🥸문제 풀이재귀적으로 어떻게 구할 수 있을까? 고민해봤다. 아래와 같은 형태가 반복되지 않을까? 함수로 치면 어느 사분면에 있는지 판단 한 후 그것을 계속 잘게 잘게 쪼개서 구하는 방식으로 재귀적으로 구하면 될 것 같았다.그림으로 이해가 될지는 모르겠지만... (x, y)를 구했다면 x의 경우 (블록 * 2), y의 경우 (블록 * 1)을 곱해줘서 몇번째 순서인지 계속 쌓아나가면 된다!import Foundationlet nrc = readLine()!.components(separatedBy: " ").map { Int($0)! }let (n, r, c) = (nrc[0], ..
· → Problems
문제 소개풀이 과정아주아주 단순하게 문제에 접근하면 아래와 같이 할 수 있을 것이다. 단순히 table을 만든 후 아래처럼 입력값에 따라서 성실하게(?) 답변을 구현한다. 물론 이렇게 풀게된다면 M 100,000이고, N 1,024일때 최악의 경우 1,024 x 1,024 x 100,000번 연산을 해야하기 때문에 시간초과다. ☠️import Foundationlet nm = readLine()!.components(separatedBy: " ").map { Int($0)! }let (n, m) = (nm[0], nm[1])var table = [[Int]]()for _ in 0..어떻게 이문제를 해결 할 수 있을까? 아래와 같은 개념을 사용하면 된다. dp로 [1][1]부터 [i][j]의 누적합을 구하..
· → Problems
문제 소개풀이 과정모든 도시를 순회하게 된다면 n!의 경우의 수가 있으므로 16! = 20조 정도의 경우의 수가 나오니 모든 경우의 수를 순회하는 것은 불가능하다. dp와 비트마스킹을 통해서 방문한 곳을 확인해야 한다. 또한 기존의 순회의 개념을 그대로 가져와서 dfs를 활용하기로 했다.  아래 부분이 메인 로직이라고 할 수 있는데, var dp = Array(repeating: Array(repeating: 16_000_000, count: 1 이러한 식으로 dp를 선언해주고 만약 4개의 노드가 있는 그래프라면 dp[0][0001]을 생각해보면  dp[2][0101]에서의 최솟값 + 0 → 2 로 가는 비용이 될 것이다. for i in 0.. 첫번째 풀이아래와 같이 문제를 풀었지만... 시간초과..
Segment Tree 란?세그먼트 트리는 범위 데이터의 조회, 업데이트에 효과적인 자료구조이다. 이진트리의 형태로 바로 O(logN)의 시간복잡도를 가지게 된다. 가장 많이 쓰이는 것은 특정 범위 내의 요소들에 대한 합계, 최솟값, 최댓값을 검색하고 처리할 수 있다. Segment Tree 만들기만약 [1, 2, 3, 4, 5] 와 같은 배열이 있다고 해보자. 이것을 Segment Tree 자료에 넣어 합계를 쉽게 검색하고 싶다. 어떻게 해야 할까? 이진트리의 기본 개념처럼 계속 반으로 쪼개서 저장해 주면 된다. 하지만 우리가 원하는 것은 합계 뿐... 아래처럼 저장해 주면 Segment Tree 끝!이다. 참 쉽죠? 이것을 코드로 구현해 보자. Segment Tree를 만들기 위한 고민Tree의 크기..
· → Problems
문제 소개https://www.acmicpc.net/problem/11689 풀이 과정자연수의 범위가 10^12이다. 절대로 1부터 순회해서 서로소를 구할 수 없다. 물론 소수를 구하게 된다면 좀 더 수월해지겠지만 순회하는 방식으로는 도저히 구할 수가 없다는 것을 알게 되었고, 결국 오일러의 피 함수를 찾아보게 되었다. 소인수를 통해 서로소의 개수를 구할 수 있는 함수이다.  오일러 피 함수 - 위키백과, 우리 모두의 백과사전위키백과, 우리 모두의 백과사전. 오일러 파이 함수의 그래프. ϕ(1)부터 ϕ(1000)까지의 값들을 나타낸다. 수론에서 오일러 파이 함수(-函數, 영어: Euler’s phi (totient) function)는 정수환의 몫환의 가ko.wikipedia.org 공식을 알고나니 구현..
Swift librarian
Swift Library