알고리즘/탐색 7

백준[2110] 공유기 설치 (Swift)

문제를 읽었을 때 문제가 이해가 되지 않아서 3번 정도 읽고, 머리로는 이해했지만 이게 이진탐색이라고.?라는 생각이 곧바로 들었다. 이전 실버 난이도 문제에서는 이진탐색을 이용하겠네 라는 생각이 들고 그 생각을 가지고 살짝 응용한다면 골드 문제부터는 이진탐색을 적용해야 하는 mid, start, end 기준을 스스로 생각하여 정해야 풀 수 있는 문제들인 것 같다. 어렵.. mid 기준만 정하는 게 가장 큰 난관이다.ㅠㅠ import Foundation func findMaxOfMinimum(arr: [Int], start: Int, end: Int, c: Int) -> Int{ var start = start var end = end while start

알고리즘/탐색 2023.03.19

백준[2805] 나무 자르기 (Swift)

해당 문제는 나무를 자른 나머지를 더할 때 total 값이 21억~~~(C++기준)을 넘어갈 까봐 Int32로 했지만 런타임 에러 발생.. 그래서 인터넷에 찾아보니 Swift 기본 자료형 Int는 엄청 범위가 넓다;; 괜한 걱정을 했네..; import Foundation func binarySearchCutTree(arr: [Int], M: Int, start: Int, end: Int) -> Int{ var start: Int = start var end: Int = end var result: Int = 0 while start = mid{ total += data - mid } } if total >= M{ start = mid + 1 result = mid } else{ end = mid - 1..

알고리즘/탐색 2023.03.19

백준[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

백준[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