분류 전체보기 198

백준[1654] 랜선 자르기 (Swift)

C++을 풀었을 때와 로직은 같지만 Swift에서 지원해주는 라이브러리들이 편리해서 코드를 간결하게 작성할 수 있는 것 같다. import Foundation func binarySearchCutLan(arr: [Int], start: Int, end: Int, target: Int) -> Int{ var start = start var end = end var result = 0 while(start = mid{ total += data / mid } } if total >= target{ start = mid + 1 result = mid } else { end = mid - 1 } } return result } func cutLan(){ let input = readLine()!.split(sep..

알고리즘/탐색 2023.03.19

백준[10816] 숫자 카드 2 (Swift)

swift로 백준 문제를 풀 때는 시간초과를 항상 고려해야한다. 처음에는 C++에서 풀었던 방식으로 배열을 정렬하고 해당 요소의 첫 번째 인덱스와 마지막 인덱스를 구해서 빼려고 했지만 곧바로 시간초과.. ㅠ dictionary를 이용하면 배열을 도는 그런 시간을 아낄 수 있기에 dictionary를 사용하여 문제를 해결하였다. import Foundation func numberCard2(){ let _ = readLine()! var arryM = readLine()!.split(separator: " ").map({Int($0)!}) let _ = readLine()! let arryN = readLine()!.split(separator: " ").map({Int($0)!}) var dict = [..

알고리즘/탐색 2023.03.19

백준[2805] 나무 자르기

해당 문제는 백준[1654] 랜선 자르기와 매우 흡사한 문제이다. 재귀함수를 이용하면 코드가 간결해져서 쉽지만 시간초과가 날까 봐 재귀함수를 사용하지 못하겠다ㅜ #include int findMaxBranches(vector &arr, int M, int start, int end){ int result = 0; while(start= M){ result = mid; start = mid + 1; } else{ end = mid - 1; } } return result; } void cutTree(){ int N,M; scanf("%d%d",&N,&M); vector arr; for(int i=0;i

알고리즘/탐색 2023.03.11

백준[1654] 랜선 자르기

해당 문제는 이진 탐색을 살짝 응용한 문제인데 전체적인 코드를 짜기는 쉬웠지만.. 특수한 케이스들이 존재해서 해당 반례를 찾느라 푸는 시간이 많이 늦어졌다..ㅠ #include long long findcuttingSize(vector &arr,long long N, long long start, long long end){ long long result = 0; while(start= N){ result = mid; start = mid + 1; } else{ end = mid - 1; } } return result; } void cuttingLan(){ long long K,N; cin>>K>>N; vector arr; long long max = 0; for(int i=0;i

카테고리 없음 2023.03.11

백준[10816] 숫자 카드 2

이분 탐색을 살짝 응용한 문제인데 Cpp 라이브러리를 찾다가 이분탐색을 쉽게 사용하는 함수가 있었다.! upper_bound 이분 탐색을 수행하여 원하는 값의 마지막 주소값을 반환 lower_bound 이분 탐색을 수행하여 원하는 값의 첫 번째 주소값을 반환 위 함수를 이용하면 이분탐색을 손쉽게 할 수 있다. #include void numberCard2(){ int N; scanf("%d",&N); vector arrN; for(int i=0;i

알고리즘/탐색 2023.03.11

백준[1920] 수찾기

이분탐색을 이용하면 쉽게 해결할 수 있는 문제이다. scanf와 printf를 대신 cin, cout을 사용하면 시간초과가 날 수도 있다. #include int recursiveFindNumber(vector &arr, int target, int start, int end){ if(start > end) return 0; int mid = (start + end) /2; if( arr[mid] == target) return 1; else if (arr[mid] > target) return recursiveFindNumber(arr, target, start, mid-1); else return recursiveFindNumber(arr, target, mid+1, end); } void findN..

알고리즘/탐색 2023.03.11

property wrapper

특징 특정 값을 한 번 감싸서 저장을 위한 로직(setter)과 얻어오기 위한 로직(getter)을 어느 정도 분리해서 반복을 줄여주는 방법을 제공한다. 키워드는 지역 변수에만 사용이 가능하다. @UserDefault, @State, @Binding등 많이 있다. 아마 SwiftUI를 사용해 보았다면 한 번쯤은 보았을 것이다. 예제를 살펴보면 쉽게 이해할 수 있다. @propertyWrapper struct Money{ private var money: Int init() {self.money = 0} var wrappedValue: Int{ get {return self.money} set {self.money += newValue} } } struct Bank{ @Money var firstPeopl..

iOS/Swift 상식 2023.03.10

defer

defer는 되게 신기하게 동작하는 기능이다. 특징 현재 코드 블록을 빠져나가기 전에 실행해야 하는 코드를 작성할 수 있다. 함수에서 오류가 발생하여 코드가 블록을 빠져가게 되면 해당 함수가 할당한 메모리를 안전하게 해제할 수 있다. 실행되는 순서는 다음 두 가지 규칙을 따른다. 실행 규칙 defer가 중복될 때 역순으로 실행된다. 하나의 defer는 선언된 코드 블록을 빠져나가기 직전에 실행된다. 예시를 통해 알아보면 빠르게 이해할 수 있다. class A{ func test() { defer { print("test 1") } do { defer { print("test 2") } print("test 3") } for i in 0..

iOS/Swift 상식 2023.03.09

Extension 이란?

Extension은 새로운 함수적 기능을 class, struct, enum, protocol에 확장한다는 의미를 가진다. Extension으로 타입에 추가할 수 있는 기능 연산 타입 프로퍼티/ 연산 인스턴스 프로퍼티 타입 메서드/ 인스턴스 메서드 이니셜라이저 SubScripts 중첩 타입 특정 프로토콜을 준수할 수 있도록 기능 추가 상속과 Extension의 차이점 상속 Extension 타입 클래스 타입만 가능 구조체, 클래스, 프로토콜 등에 적용 가능 특징 - 특정 타입을 물려받아 하나의 새로운 타입을 정의하고 추가 기능을 구현할 수 있음 - 수직 확장 - 기존 타입에 기능을 추가 가능 - 수평 확장 - 특정 타입을 준수하는 프로토콜 별 구현부를 분리하여 코드 가독성을 높일 수 있음 override..

iOS/Swift 상식 2023.03.08

Alamofire + RxSwift + MVVM

우선 RxSwift는 Return을 통해 데이터를 가지고 온다. Rxswift를 사용하기 전에는 Alamofire으로 통신하는 경우 @escaping을 통해 데이터를 viewModel로 가져온 뒤 같은 방법으로 View로 데이터를 전달하였다. 해당 방법을 사용하면 코드가 복잡해지고 직관적이지 못하다는 단점이 있다. (저는 그렇더라고요..ㅎ) 그래서! 우선 먼저 전체적인 흐름을 설명하자면 Alamofire post 통신을 한 후 Observable을 이용하여 ViewModel 데이터를 가져온다. 가져온 데이터를 다시 Alamofire get 통신을 한 후 Observable을 이용하여 ViewModel 데이터를 가져온다. ViewModel로 가져온 데이터를 Observable을 이용하여 View로 보낸다...

iOS/RxSwift 2023.03.05