본문 바로가기

이분 탐색

(15)
(C++) - 백준(BOJ) 2143번 : 두 배열의 합 https://www.acmicpc.net/problem/2143 2143번: 두 배열의 합 첫째 줄에 T(-1,000,000,000 ≤ T ≤ 1,000,000,000)가 주어진다. 다음 줄에는 n(1 ≤ n ≤ 1,000)이 주어지고, 그 다음 줄에 n개의 정수로 A[1], …, A[n]이 주어진다. 다음 줄에는 m(1 ≤ m ≤ 1,000)이 주어지고, 그 www.acmicpc.net 이분탐색으로 푼 문제였습니다. 풀이방법 1. vector a, b에 입력을 받습니다. 2. i ~ j까지의 누적합을 a, b 각각에 저장합니다. 3. 이분탐색을 위해 b를 정렬합니다. 4. a + b = t이므로 모든 a에 대해 b가 t - a인 값을 찾습니다. 해당 값이 여러개 있을 수 있으므로 lower_bound..
(C++) - 백준(BOJ) 7453번 : 합이 0인 네 정수 https://www.acmicpc.net/problem/7453 7453번: 합이 0인 네 정수 첫째 줄에 배열의 크기 n (1 ≤ n ≤ 4000)이 주어진다. 다음 n개 줄에는 A, B, C, D에 포함되는 정수가 공백으로 구분되어져서 주어진다. 배열에 들어있는 정수의 절댓값은 최대 228이다. www.acmicpc.net 이분 탐색으로 해결한 문제였습니다. 풀이방법 1. 입력 받은 후 loop를 돌며 다음을 저장합니다. sums1에는 a[i] + b[j]들, sums2에는 c[i] + d[j]. 이렇게 a + b의 쌍들과 c + d의 쌍들이 저장되었습니다. 이 후 두 배열을 오름차순으로 정렬합니다. 2. 모든 sums1에 대해 sums2로부터 -sums1[i]인 값을 찾아 그 index를 구합니다..
(C++) - 백준(BOJ) 3896번 : 소수 사이 수열 https://www.acmicpc.net/problem/3896 3896번: 소수 사이 수열 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 테스트 케이스는 한 줄로 이루어져 있고, 한 줄에 정수 k가 주어진다. 각각의 정수는 1보다 크고, 100000번째 소수(1299709)와 작거나 같다. www.acmicpc.net 소수 찾기 + 이분탐색문제였습니다 풀이방법 1. 100000번째 소수까지 모두 구해놓습니다. 에라토스테네스의 체 방식을 이용하면 O(루트N)으로 빠르게 구할 수 있습니다. 2. 소수라면 0을 출력, 이분탐색으로 해당 수보다 큰 가장 가까운 소수에 해당하는 인덱스를 찾습니다. 그 후 해당인덱스 - (해당인덱스 - 1)의 값을 출력합니다. Code #include using namespa..
(C++) - 프로그래머스(2019 카카오 개발자 겨울 인턴십) : 징검다리 건너기 https://programmers.co.kr/learn/courses/30/lessons/64062 코딩테스트 연습 - 징검다리 건너기 [2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3 programmers.co.kr 이분탐색으로 푼 문제입니다. 풀이방법 최대로 건널 수 있는 인원을 찾아야합니다. 1. 인원을 mid라고 생각했을 때 최대한으로 건넌 후의 각 돌들의 높이는 밟을 때마다 1씩줄어들기 때문에 결과적으로 돌높이 - 인원 수가 됩니다. 이 (돌높이 - 인원 수) 값이 0이하라면 건너뛰어야 하는 돌이 됩니다. 2. 모든 stones에 대해 연속되는 0이하의 구간들 중 최장구간의 길이를 cnt변수에 저장합니다. 3. cnt >= k라면 너무 많은 인원이 건넌 것이므로 right = mi..
(C++) - 백준(BOJ) 3020번 : 개똥벌레 www.acmicpc.net/problem/3020 3020번: 개똥벌레 개똥벌레 한 마리가 장애물(석순과 종유석)로 가득찬 동굴에 들어갔다. 동굴의 길이는 N미터이고, 높이는 H미터이다. (N은 짝수) 첫 번째 장애물은 항상 석순이고, 그 다음에는 종유석과 석순이 www.acmicpc.net 이분 탐색 문제였습니다. 풀이방법 1. 석순이나 종유석의 서순은 중요하지 않습니다. 높이에 따라 부서질지 아닐지만 확인하면 되기 때문에 정렬해도 문제였습니다. 석순과 종유석에 대한 입력을 두개의 vector 변수에 나눠 담고 오름차순으로 sort해줍니다. 2. 구역을 1부터 시작해 height까지 loop를 돌며 최소의 장애물 파괴 수를 구합니다. 석순의 경우 선택한 구역(i) 이상의 높이를 가진 인덱스를 구해줍니..
(C++) - 백준(BOJ) 7795번 : 먹을 것인가 먹힐 것인가 www.acmicpc.net/problem/7795 7795번: 먹을 것인가 먹힐 것인가 심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을 www.acmicpc.net lower_bound를 구현해보는 혹은 사용해보는 문제였습니다. 풀이방법 1. a,b를 오름차순으로 정렬합니다. 2. 모든 a의 원소들에 대해서 이분탐색을 시행합니다. a의 원소가 b의 원소 이하가 되는 index 지점을 찾게 된다면 해당 index지점까지 생명체 a는 b생명체를 먹을 수 있습니다. 이를 다르게 표현하자면 a의 원소값의 lower_bound 지..
(C++) - 백준(BOJ) 2776번 : 암기왕 답 www.acmicpc.net/problem/2776 2776번: 암기왕 연종이는 엄청난 기억력을 가지고 있다. 그래서 하루 동안 본 정수들을 모두 기억 할 수 있다. 하지만 이를 믿을 수 없는 동규는 그의 기억력을 시험해 보기로 한다. 동규는 연종을 따라 다니며, www.acmicpc.net 입출력이 많기 때문에 c의 헤드들과 동기화를 끊어줘야 합니다. 그 후 이분탐색하시면 됩니다. 풀이방법 찾았다면 flag = 1로 만들어주고 찾기 못했다면 flag가 초기값 그대로인 0이므로 이분탐색 시행 후 flag를 return 해주면 됩니다. Code #include #define fastio ios_base::sync_with_stdio(0); cout.tie(0); cin.tie(0); using namesp..
(C++) - 백준(BOJ) 1756번 : 피자 굽기 답 www.acmicpc.net/problem/1756 1756번: 피자 굽기 월드피자 원주 지점에서 N개의 피자 반죽을 오븐에 넣고 구우려고 한다. 그런데, 월드피자에서 만드는 피자 반죽은 지름이 제각각이다. 그런가하면, 월드피자에서 사용하는 오븐의 모양도 몹시 www.acmicpc.net 이분탐색 구현방법을 생각해야하는 문제였습니다. 풀이방법 1. 이분탐색은 정렬이 되었을 때 할 수 있기 때문에 구불구불한 오븐을 정리해야합니다. 위에서 봤을 때 오븐의 중간층은 넓어도 그 위의 층들이 중간층보다 좁을 때 중간층이 튀어나온 부분을 확인할 수 없습니다. 여기서 착안해서 오븐을 위에서 봤을 때 위층부터 너비의 내림차순으로 오븐 너비를 수정할 수 있습니다. 2. 이분탐색 시행 : 이전에 놓았던 오븐의 너비 보다 ..