🤔 문제 상황우선 앱을 전체적으로 버전 업 하기 전에 예열을 할 겸 간단한 것부터 개선해 보았다.1. 조금 더 기본적인 폰트의 필요성현재는 앱에 전체적으로 Gmarket Sans 폰트가 적용되어 있었다. 물론 좋은 폰트이지만 앱에 전체적으로 적용되는 폰트이기 때문에 콘텐츠가 많아진다면 약간은 피로하게 느껴질 수도 있겠다는 생각을 했고, 살짝 옆으로 퍼져있는 폰트이기 때문에 변경이 필요하다고 느꼈다.2. 이미지 중복 사용앱의 용량과도 관련이 있었는데, 아래와 같이 똑같은 이미지이지만 색상만 조금씩 바뀌어서 있는 이미지 파일들이 있었고, 이를 코드로 관리하면 용량적인 측면에서도 가벼워지고 조금 더 유지보수가 쉬워 보였다.💡 해결 과정1. 폰트 선정아래와 같이 후보군은 기존의 SF Pro, Spoqa Ha..
전체 글
🔺 버전 업 계기기존에 아래와 같은 테이스팅 노트 기록 앱을 개발하고 배포하고 있었다. 테이스터다양한 테이스팅 노트를 기록할 수 있는 앱apps.apple.com 얼마 전에 네이버 부스트캠프 챌린지가 끝나고 주말에 App Store Connect에서 내 앱들을 살펴봤는데 7월 중순쯤 정말 정성스럽게 작성해 주신 리뷰를 발견했다...개발자로서 약간 부끄럽다고 생각했다. 🥲 내가 배포한 앱인데 애정을 가지고 유지보수를 했어야 했는데... 솔직히 바쁘다는 핑계로 개발했던 앱을 살펴보지 못했다. 그래서 지금부터라도 요청사항과 디테일한 기능들을 추가해서 앱을 발전시켜 나가야겠다는 생각을 했다.🎯 버전 업 목표1. 검색, 필터링 기능 추가VoC를 반영하여 조금더 디테일한 검색, 필터링 기능을 넣을 예정이다..
문제 소개문제 풀이사실... 이 문제는 의외로 간단하게 풀렸다. 😇하위 팀들 조건 판별우선 점수들을 오름차순으로 정리하고, 하위 팀들끼리 경기를 한다고 가정해보자. 하위 팀들끼리 경기를 한다고 가정한다면 최소한의 가져가야 하는 점수가 있다. 총 k개의 팀이 있다면 (k - 1) * k / 2 의 점수는 최소한 있어야 한다. 그 조건을 만족하지 않으면 -1을 출력하고 프로세스를 종료했다.for k in 1..총 점수 합 판별마지막 n개의 팀에서는 n * (n - 1) / 2 가 총합이여야 한다.if scores.reduce(0, +) != n * (n - 1) / 2 { print(-1) exit(0)}이 두개의 조건을 만족해주면 주어진 점수들은 유효한 점수이다.정답 코드import Found..
🧐 문제 상황경로가 그려지지 않는 상황watchOS에서 경로가 그려지지 않는 문제가 발생했다. ☠️ Outline 앱에서 가장 중요한 경로가 그려지지 않는다는 것은 큰 문제였다...사실 문제는 간단하게 해결이 가능했다. 바로 iOS, watchOS에서 공통으로 쓰는 LocationManager의 startUpdate()라는 메서드를 watchOS에서 호출하지 않아서 생긴 문제였다. 분명 이전에는 잘 작동했는데... iOS앱에서 변경사항이 생기자 그것이 watchOS앱까지 영향이 가버린 Side Effect 즉, 부작용이라고 생각되었다.리팩토링의 필요성 ♻️이전에는 공통으로 쓰이는 메서드들이 많다보니 시간이 부족하기도 하고, 큰 생각없이 당연하게 Target Membership을 iOS, watchOS..
🧐 문제 상황Smooth 알고리즘 문제점 발견아래와 같이 Smooth 적용 후 크지 않은 경로는 아래와 같이 조금 뭉개지는 현상과 처음과 끝이 연결되지 않는 상황이 발생했다!💡 해결 과정기존 로직 뜯어보기기존의 코드를 살펴보았다. 내가 봐야할 부분은 마지막이 연결이 안되는 부분과 라인이 뭉개지는 이유였다. private func smoothLocations(_ locations: [CLLocationCoordinate2D]) -> [CLLocationCoordinate2D] { guard locations.count > 1 else { return locations } var smoothed: [CLLocationCoordinate2D] = [] ..
🧐 문제 설명1. 썸네일의 URL 불러오기썸네일이 Firebase와 같은 외부 저장소에 URL 형태로 저장되어, 불러올 때마다 네트워크 비용이 증가하고 여러 썸네일을 불러올 때 앱의 응답성에 안좋은 영향을 미칠 위험이 있다.이미지 경로를 직접 하드코딩하여 사용하는 방식은 이미지 경로를 변경하거나 파일 위치를 수정할 때마다 코드 전반에서 수정을 해야 하기 때문에 유지보수성이 떨어질 것으로 예상된다.2. RecordView, CardView에서 지도 로드 문제현재의 구현 방식은 지도를 반복적으로 렌더링하여 리소스를 소비하고 있었다. 이러한 비효율성은 앱의 성능 저하와 리소스 낭비로 이어지며, 특히 저사양 기기에서 더 큰 문제를 일으킬 수 있다고 판단했다.또한 실제로 실 기기 사용시 아래의 그림처럼 러닝 횟..
문제 소개월요일을 기념하며... 약간은 풀만한 문제(?)에 도전했다..! 문제에 친절하게도 재귀적으로 방문한다는 힌트가 있다! 🥸문제 풀이재귀적으로 어떻게 구할 수 있을까? 고민해봤다. 아래와 같은 형태가 반복되지 않을까? 함수로 치면 어느 사분면에 있는지 판단 한 후 그것을 계속 잘게 잘게 쪼개서 구하는 방식으로 재귀적으로 구하면 될 것 같았다.그림으로 이해가 될지는 모르겠지만... (x, y)를 구했다면 x의 경우 (블록 * 2), y의 경우 (블록 * 1)을 곱해줘서 몇번째 순서인지 계속 쌓아나가면 된다!import Foundationlet nrc = readLine()!.components(separatedBy: " ").map { Int($0)! }let (n, r, c) = (nrc[0], ..
문제 소개풀이 과정아주아주 단순하게 문제에 접근하면 아래와 같이 할 수 있을 것이다. 단순히 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]의 누적합을 구하..