전체 글

· → Outline
🧐 문제 상황코드의 불필요한 중복, 로직의 분리 필요기존의 RecordView만 보더라도 총 240줄의 긴 파일이었고, 당장 뷰와 로직의 분리가 되지 않아 유지보수, 가독성 부분에서 안좋은 부분이 많았습니다. 또한 필터링 부분이나 불필요한 print, 중복되는 언래핑등으로 코드의 개선이 필요했습니다. 또한 이러한 중복적인 계산로직으로 카드가 나타나는 UI를 표시하는 부분이 안보이기도 하는 오류도 발생했다. RecordView만 봐도 알 수있듯이 시간에 쫓겨서 개발한 코드이기도 하고 이전에 작성한 코드이기도 하다보니 개선사항이 많이 보였다. 😎// 불필요한 중복 계산, 로직과 뷰의 분리 문제struct RecordView: View { // 너무 많은 속성 변수들 @AppStorage("authS..
· → Problems
문제 소개난이도가 어려워질수록 문제 자체는 간단해지는 느낌이 든다. 히스토그램이 주어지고 넓이가 가장 큰 직사각형을 구하는 프로그램을 작성하는 문제이다.문제 풀이나는 스택을 활용하여 풀었다. 아래와 같은 히스토그램이 있다고 생각해보자.아래와 같이 stack의 마지막 요소의 높이가 추가하려는 높이보다 작다면 stack에 append해준다.마지막은 이제 4번째 인덱스가 3번째 인덱스의 높이 4보다 낮은 상황이다. 이제 이 상황에서 로직을 사용하게 된다. 넣으려는 요소의 -1을 하면 앞에 쌓인 블록들의 width가 나온다. 이것을 현재 블록의 높이, 블록의 인덱스의 차이를 이용하여 넓이의 최댓값을 갱신해준다. 만약 pop하고 마지막 값이 없다면 그냥 width를 곱해주면 된다.pop하는 값의 높이가 추가하려는..
· → Problems
문제 소개유명한 다이나믹 프로그래밍 문제인 LCS(Longest Common Subsequence) 문제를 풀어보았다.문제 풀이 [알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common SubsequenceLCS는 주로 최장 공통 부분수열(Longest Common Subsequence)을 말합니다만, 최장 공통 문자열(Longest Common Substring)을 말하기도 합니다.velog.io이 블로그... 너무 설명을 잘해주셨다. 아래와 같이 Subsequence를 탐색하면 된다.1. LCS 2차원 배열 선언2차원 배열을 선언해준다. first와 second의 첫글자를 가져와서 변수명을 지었다.let f = Array(readLin..
· → Problems
문제 소개피보나치를 구하는 방법은 재귀, dp등 다양하지만 이 문제는 n의 범위가 10^18 인 무시무시한 문제다. 당연 O(n)으로 문제를 푼다면 틀리게 된다.문제 풀이이 문제는 좀더 수학적으로 접근해야 한다. 우선 너무나도 유명한 피보나치 수열의 일반항은 아래와 같다.이것을 행렬로 나타낸다면 아래와 같이 나타낼 수 있다.오른쪽을 쭈우우우욱 풀어준다면... 아래와 같이 결국 표현된다. 이제 우리는 행렬의 n-1 제곱만 구해주면 된다!2x2 행렬의 곱은 아래와 같이 구할 수 있다.func multiply(_ a: [[Int]], _ b: [[Int]]) -> [[Int]] { let x = (a[0][0] * b[0][0] + a[0][1] * b[1][0]) % mod let y = (a[0][0] *..
· → Problems
문제 소개사실 문제를 처음보고 이해를 못했는데 🥲 예시를 보고 이해가 되었다.과정은 다음과 같다.좌표를 오름차순으로 정렬하고, 중복되는 값을 제거해준다.원래 배열에 1번에서 만든 정렬된 배열의 인덱스로 바꾼뒤 출력해준다.문제 풀이아래처럼 nums를 Set으로 만들어 준 뒤, 정렬했다.// Set로 만들어주는 부분!let arr = Set(nums).sorted()아래와 같이 딕셔너리를 만든다// 인덱스를 value, 배열의 값을 key로 딕셔너리 자료구조로 만들기let dic = Dictionary(uniqueKeysWithValues: arr.enumerated().map { ($1, $0) })정답 코드import Foundationlet n = Int(readLine()!)!var nums = r..
· → Taster
🤔 문제 상황우선 앱을 전체적으로 버전 업 하기 전에 예열을 할 겸 간단한 것부터 개선해 보았다.1. 조금 더 기본적인 폰트의 필요성현재는 앱에 전체적으로 Gmarket Sans 폰트가 적용되어 있었다. 물론 좋은 폰트이지만 앱에 전체적으로 적용되는 폰트이기 때문에 콘텐츠가 많아진다면 약간은 피로하게 느껴질 수도 있겠다는 생각을 했고, 살짝 옆으로 퍼져있는 폰트이기 때문에 변경이 필요하다고 느꼈다.2. 이미지 중복 사용앱의 용량과도 관련이 있었는데, 아래와 같이 똑같은 이미지이지만 색상만 조금씩 바뀌어서 있는 이미지 파일들이 있었고, 이를 코드로 관리하면 용량적인 측면에서도 가벼워지고 조금 더 유지보수가 쉬워 보였다.💡 해결 과정1. 폰트 선정아래와 같이 후보군은 기존의 SF Pro, Spoqa Ha..
· → Taster
🔺 버전 업 계기기존에 아래와 같은 테이스팅 노트 기록 앱을 개발하고 배포하고 있었다. ‎테이스터‎다양한 테이스팅 노트를 기록할 수 있는 앱apps.apple.com 얼마 전에 네이버 부스트캠프 챌린지가 끝나고 주말에 App Store Connect에서 내 앱들을 살펴봤는데 7월 중순쯤 정말 정성스럽게 작성해 주신 리뷰를 발견했다...개발자로서 약간 부끄럽다고 생각했다. 🥲 내가 배포한 앱인데 애정을 가지고 유지보수를 했어야 했는데... 솔직히 바쁘다는 핑계로 개발했던 앱을 살펴보지 못했다. 그래서 지금부터라도 요청사항과 디테일한 기능들을 추가해서 앱을 발전시켜 나가야겠다는 생각을 했다.🎯 버전 업 목표1. 검색, 필터링 기능 추가VoC를 반영하여 조금더 디테일한 검색, 필터링 기능을 넣을 예정이다..
· → Problems
문제 소개문제 풀이사실... 이 문제는 의외로 간단하게 풀렸다. 😇하위 팀들 조건 판별우선 점수들을 오름차순으로 정리하고, 하위 팀들끼리 경기를 한다고 가정해보자. 하위 팀들끼리 경기를 한다고 가정한다면 최소한의 가져가야 하는 점수가 있다. 총 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..
Swift librarian
Swift Library