🧐 현재 상황네이버 부스트 캠프에서 Test코드를 꾸준히 작성하는 습관을 기르고 있는데, 코드를 리팩토링 할 때 정말 놀라운 경험을 할 수 있었다. 결국 리팩토링을 하더라도 기존의 요구사항과 똑같은 기능을 가지고 있어야 하는데, 테스트 코드를 작성하고 리팩토링 하다 보니 놓친 기능들도 확인할 수 있었고, 내가 리팩토링 한 것들이 잘 작동하는지도 즉각 즉각 확인해 볼 수 있었다. 그래서 이번에 테스트 주도 개발을 해보기로 했다! 도대체 TDD를 어떻게 해야 할까? 테스트 코드부터 작성한다!라는 개념만 알고 있었지만 막상 TDD 개발을 하려니 어떻게 해야 할지에 대한 감이 잡히지 않았다.🥸 학습 과정TDDIBM에서 작성한... 무려 최최최신자료인 24년 7월에 작성한 글이 있었다. 5가지 간단한 스탭을 ..
전체 글
📽️ 프로젝트 개요간단하게 환율, 주가를 맞출 수 있는 Guesser라는 프로젝트를 시작해 보기로 했다. 네이버 부스트 캠프에서 공부하게 된 UIKit을 좀더 긴 호흡으로도 가져가고 싶었고, 아무래도 내가 기획하고 내가 만들고 싶은 앱을 만드는 것이 좀더 열정도 타오르기 때문에!! 🔥🔥 시작해보기로 했다. 그리고 다양한 것들을 시도해보고 학습해보고 싶다는 생각을 했다. 🎯 프로젝트 목표이번 프로젝트는 조금 다르게 해보기로 했다. 우선 테스트 주도 개발(TDD)를 통해 프로젝트를 진행하기로 했고, UI에 집중하기 보다는 조금더 프로젝트 진행 방식, 프로그래밍적 학습에 집중해보고 싶다. 목표를 정리해보자면... (욕심이긴 하지만...)TDDSnapKitMVC → MVVM 과정 경험하기Combine 사..
🧐 문제 상황코드의 불필요한 중복, 로직의 분리 필요기존의 RecordView만 보더라도 총 240줄의 긴 파일이었고, 당장 뷰와 로직의 분리가 되지 않아 유지보수, 가독성 부분에서 안좋은 부분이 많았습니다. 또한 필터링 부분이나 불필요한 print, 중복되는 언래핑등으로 코드의 개선이 필요했습니다. 또한 이러한 중복적인 계산로직으로 카드가 나타나는 UI를 표시하는 부분이 안보이기도 하는 오류도 발생했다. RecordView만 봐도 알 수있듯이 시간에 쫓겨서 개발한 코드이기도 하고 이전에 작성한 코드이기도 하다보니 개선사항이 많이 보였다. 😎// 불필요한 중복 계산, 로직과 뷰의 분리 문제struct RecordView: View { // 너무 많은 속성 변수들 @AppStorage("authS..
문제 소개난이도가 어려워질수록 문제 자체는 간단해지는 느낌이 든다. 히스토그램이 주어지고 넓이가 가장 큰 직사각형을 구하는 프로그램을 작성하는 문제이다.문제 풀이나는 스택을 활용하여 풀었다. 아래와 같은 히스토그램이 있다고 생각해보자.아래와 같이 stack의 마지막 요소의 높이가 추가하려는 높이보다 작다면 stack에 append해준다.마지막은 이제 4번째 인덱스가 3번째 인덱스의 높이 4보다 낮은 상황이다. 이제 이 상황에서 로직을 사용하게 된다. 넣으려는 요소의 -1을 하면 앞에 쌓인 블록들의 width가 나온다. 이것을 현재 블록의 높이, 블록의 인덱스의 차이를 이용하여 넓이의 최댓값을 갱신해준다. 만약 pop하고 마지막 값이 없다면 그냥 width를 곱해주면 된다.pop하는 값의 높이가 추가하려는..
문제 소개유명한 다이나믹 프로그래밍 문제인 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..
문제 소개피보나치를 구하는 방법은 재귀, 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] *..
문제 소개사실 문제를 처음보고 이해를 못했는데 🥲 예시를 보고 이해가 되었다.과정은 다음과 같다.좌표를 오름차순으로 정렬하고, 중복되는 값을 제거해준다.원래 배열에 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..
🤔 문제 상황우선 앱을 전체적으로 버전 업 하기 전에 예열을 할 겸 간단한 것부터 개선해 보았다.1. 조금 더 기본적인 폰트의 필요성현재는 앱에 전체적으로 Gmarket Sans 폰트가 적용되어 있었다. 물론 좋은 폰트이지만 앱에 전체적으로 적용되는 폰트이기 때문에 콘텐츠가 많아진다면 약간은 피로하게 느껴질 수도 있겠다는 생각을 했고, 살짝 옆으로 퍼져있는 폰트이기 때문에 변경이 필요하다고 느꼈다.2. 이미지 중복 사용앱의 용량과도 관련이 있었는데, 아래와 같이 똑같은 이미지이지만 색상만 조금씩 바뀌어서 있는 이미지 파일들이 있었고, 이를 코드로 관리하면 용량적인 측면에서도 가벼워지고 조금 더 유지보수가 쉬워 보였다.💡 해결 과정1. 폰트 선정아래와 같이 후보군은 기존의 SF Pro, Spoqa Ha..