문제 부족한 금액 계산하기 풀이 count 만큼 이용하려면 필요한 돈을 계산 필요한 돈 - 가지고 있는 돈(money) 모자르지 않다면 0을 return import Foundation // MARK: - 1 func solution1(_ price:Int, _ money:Int, _ count:Int) -> Int64 { var sum = 0 for i in 1...count { sum += i * price } let answer = sum - money return answer Int{ return max((count + 1) *..
문제 없는 숫자 더하기 풀이 0~9 까지 중 numbers에 포함되지 않은 숫자를 찾는다 찾은 숫자를 모두 더한다 import Foundation // MARK: - 1 func solution(_ numbers:[Int]) -> Int { return [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] .filter { !numbers.contains($0) } .reduce(0, { $0 + $1 }) } // MARK: - 2 func solution2(_ numbers: [Int]) -> Int { return (0...9).filter { !numbers.contains($0) }.reduce(0, +) } // MARK: - 3 func solution3(_ numbers:[Int]) ->..
문제 로또의 최고 순위와 최저 순위 풀이 로또랑 당첨번호랑 다른 숫자들을 찾는다. 다른 숫자들 중 0을 찾는다. 0에 다른 번호들을 넣고 등수를 체크한다. (중복없이)풀이 후 import Foundation // MARK: - First func solution(_ lottos:[Int], _ win_nums:[Int]) -> [Int] { var bestLottos = [Int]() lottos.forEach { lotto in if lotto == 0 { let bestLotto = win_nums.first(where: { num in !bestLottos.contains(num) && !lottos.contains(num) })! bestLottos.append(bestLotto) } else {..
문제 모든 명함이 다 들어가지만 가장 작은 지갑의 크기를 구해라 입출력 예 입력 - [[60, 50], [30, 70], [60, 30], [80, 40]], 출력 - 4000(80x50) 가장 긴 가로 길이와 세로 길이가 각각 80, 70이기 때문에 80(가로) x 70(세로) 크기의 지갑을 만들면 모든 명함들을 수납할 수 있습니다. 하지만 2번 명함을 가로로 눕혀 수납한다면 80(가로) x 50(세로) 크기의 지갑으로 모든 명함들을 수납할 수 있습니다. 이때의 지갑 크기는 4000(=80 x 50)입니다. 풀이 가장 큰 수를 구한다. 가로든 세로든 가장 큰 길이는 무조건 필요하다. 가장 큰 길이를 제외하고 모든 명함이 들어갈 수 있는 길이를 구한다. 가로/세로 확인하여 숫자가 큰 쪽을 큰 수에 놓고 ..
문제 각 유저는 한 번에 한 명의 유저를 신고할 수 있다. 신고 횟수에 제한은 없지만 동일한 유저에 대한 신고는 1회로 처리된다. k번 이상 신고된 유저는 게시판 이용이 정지되고 해당 유절르 신고한 모든 유저에게 정지 사실을 메일로 발송한다. return 하는 배열은 id_list에 담긴 id 순서대로 각 유저가 받은 결과 메일 수 풀이 id마다 신고당한 횟수를 세기위해 id_list를 사용해 Dictionary를 만든다. 신고한 유저와 신고 당한 유저 분리 신고할 유저와 신고 당한 유저의 중복체크 후 값 추가 신고횟수가 k 이상인 유저 찾기 신고횟수가 k 이상인 유저를 신고한 유저 찾기 들어온 id 순서대로 메일 받을 횟수 리턴 // MARK: - 1 func solution1(_ id_list:[St..

Why ? TabView를 구성하던 중 UIKit 을 사용할 때 처럼 익숙하게 사용하기 위해 정리한다. TabView ? 정의 우선 공식문서를 먼저 보자. A view that switches between multiple child views using interactive user interface elements. 사용자 인터페이스 요소를 사용해 여러 하위 뷰 간 전환할 수 있도록 하는 뷰이다. 탭바의 항목을 터치하여 화면을 전환할 수 있게 해준다. 기본 구현 TabView { ReceivedView() .badge(2) .tabItem { Label("Received", systemImage: "tray.and.arrow.down.fill") } SentView() .tabItem { Label(..

한줄 소개 매일 뭐 먹을지 고민하는 사람들을 위한 식사메뉴 추천 앱 앱 탄생배경 기존 골라밥의 UI/UX 가 너무 맘에들지 않고 사용자에게 흥미를 느낄만한 포인트가 없다고 판단했다. 그래서 디자이너와 함께 협업해보기로 했다. 사용 기술 및 라이브러리 SwiftUI Combine Alamofire Kakao Map Git Lottie Google Admob 사용 툴 Xcode 13.4.1 GitHub, Sourcetree Figma 프로젝트 후기 UI 그리는 방식을 UIKit 대신 SwiftUI를 사용했다. SwiftUI를 사용한 이유는 최소 지원버전 문제로 업무에서 사용하기 힘들다는 점과, 새로운 것을 시도해보고 싶었다. 하나하나 구글링해가면서 배우면서 개발을 진행했다. 그래서 디자이너분과 소통이 원활하..

Why ? 스와이프하면 다음 카드로 이동하는 UI를 그리고 싶어서 Horizontal ScrollView를 사용했다가 스와이프하면 자동으로 중심을 맞춰주는 뷰를 구현하고 싶었다. How ? GeometryReader를 활용했다. GeometryReader { proxy in // 스크롤하면 움직일 x축의 값 let xOffsetToShift = cardWidth + spacing HStack(spacing: 10) { ForEach(Array(viewModel.places.enumerated()), id: \\.0) { idx, place in viewModel.createPlaceCard(place: place, index: idx) } } .padding(.leading, 22) // xOffsetT..
Why ? 화면에서 2.5초 후에 네비게이션이 실행해야는 상황이였다. How ? NavigationLink(destination: NextView(), isActive: $isShowNext) { EmptyView() } // ... DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .milliseconds(2500)) { isShowNext = true } EmptyView() 는 아무것도 없는 뷰를 의미하고 isShowNext가 true가 되면 네비게이션이 실행된다 🤔 이렇게 하는게 맞는건가 라는 의문이 계속 들었다. 더 나은 방법이 생각나면 글을 수정해야겠다.
- Total
- Today
- Yesterday
- rxswift
- Git
- tabview
- delegate
- SwiftUI
- AWS
- Xcode
- ChatGPT
- navigation
- CodingTest
- 의미있는이름
- strcut
- kakao
- Swift
- Login
- IOS
- 카메라
- OCR
- Protocol
- AWS Fargate
- 곰튀김
- ObservedObject
- Generic
- MVVM
- docker
- Custom
- file private
- frame과 bounds 차이
- enumerations
- onTapGesture
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |