투 포인터 6

[G2] 백준 7453번 합이 0인 네 정수 C++ 이분 탐색, 투 포인터, upper_bound, lower_bound, 정렬

리뷰 하 너무 어려웠던 지옥같은 문제, 투 포인터 문제중에선 골드 2치고 굉장히 어려웠다.https://www.acmicpc.net/problem/7453 문제 풀이a, b, c, d배열에 값을 받아 줄 abcd를 최대치의 크기 4000 * 4의 크기로 전역 변수로 설정해 준다.ab와 cd 배열을 합칠 벡터 ab, cd와 정답을 저장할 변수 ans를 long long타입으로 전역 변수로 설정해 준다.n값을 입력 받고 n * 4 크기의 배열을 abcd 배열에 입력받아 저장해 준다.n * n크기의 브루트포스를 통해 각 경우의 수를 찾아 a + b는 ab에, c + d는 cd에 저장해 준다.ab와 cd 배열을 모두 오름차순으로 정렬해 준 후 투 포인터 탐색을 시작해 준다.p1은 ab벡터의 포인터로 0부터 시작..

[G3] 백준 2473번 세 용액 C++ 투 포인터, 브루트포스 알고리즘, 정렬

리뷰 용액 문제의 상위 버전으로 세가지 용액의 특성값의 합이 0에 가까운 케이스를 뽑는 문제https://www.acmicpc.net/problem/2473브루트포스 + 투 포인터를 사용한다면 최악의 경우 n^2 / 2로 n값이 10만이면 시간 복잡도상 안 돌아갈 줄 알았는데 생각보다 빠르게 실행돼서 의문이 좀 가긴 했다. 문제 풀이용액의 개수 n과 용액의 특성값 정보 배열 lst를 전역 변수로 설정한다. 이때 용액 세개를 더하므로 타입은 longlongn을 입력 받고 lst 배열에 각 용액의 특성값을 입력받는다, 이후 오름차순으로 정렬해 준다.정답 출력용 al, am, ar 변수를 초기화 하고 ans값을 30억으로 설정해 준다, ans도 longlong타입으로 설정한다.첫번재 용액은 브루트포스를 통해 ..

[G5] 백준 2467번 용액 C++ 투 포인터

리뷰 두 용액의 합이 0과 가장 가까워 지는 순서쌍을 출력하는 문제https://www.acmicpc.net/problem/2467 문제 풀이용액의 개수 n과 용액의 특성값을 저장할 lst배열을 용액의 최대치 만큼의 크기로 설정한다.n값을 입력 받고 n개의 용액의 특성값을 lst배열에 저장해 준 후 lst배열을 오름차순으로 정렬해 준다.left는 0부터 right는 n - 1부터 탐색을 시작하고 정답을 출력할 al, ar를 초기화 하고 ans는 매우 큰 값으로 초기화 한다.left가 right보다 작을때만 탐색을 진행해 준다. lst의 left와 right 인덱스를 더한값을 sum에 저장해 준다.sum의 절댓값이 ans보다 작으면 ans를 갱신시켜 준다, 만약 0일 경우 바로 탐색을 종료한다.ans가 갱..

[G4] 백준 1806번 부분합 C++ 누적 합, 투 포인터

리뷰 포인터 두개를 늘려가며 수열에서의 부분합이 특정 수 이상이 되는 가장 짧은 길이를 찾는 문제https://www.acmicpc.net/problem/1806 문제 풀이수열의 길이 n, 찾을 값 d, 정답 식별용 ans, 수열의 정보 배열lst를 전역 변수로 설정해 준다.n과 d값을 입력받고, n길이의 수열 정보를 lst 배열에 입력받아 준다.전위 포인터s와 후위 포인터e를 모두 0으로 초기화 해주고 sum을 lst의 0번째 인덱스의 수로 초기화 해준다.s가 e보다 앞서거나 e가 n의 범위를 벗어나기 전까지 while 루프를 진행한다.현재 sum값이 d보다 작다면 e를 증가시키고 sum에 lst의 e번째 인덱스의 수를 추가해 준다.만약 반대라면 ans를 e - s + 1과 비교하여 길이의 최소값을 갱..

백준 3273번 두 수의 합 C++ 투 포인터, 정렬

리뷰배열내 요소를 조합하여 특정 숫자를 만족하는 조합의 개수를 찾기https://www.acmicpc.net/problem/3273  문제 풀이n을 입력 받고 배열 arr에 n개의 수를 입력 받아준다. 이후 목표 숫자 target을 입력 받고 arr 배열을 정렬해 준다.개수를 샐 변수 cnt를 0으로, 왼쪽에서 탐색할 left 변수를 0으로, 오른쪽에서 탐색할 right 변수를 n - 1로 초기화 한다.left가 right보다 적을 때 while 루프를 실행한다.arr[left]와 arr[right]를 더했을 때 target보다 크다면 right를 1 줄여준다.arr[left]와 arr[right]를 더했을 때 target보다 작다면 left를 1 늘려준다.만약 target을 찾았다면 cnt를 1 증가시..

백준 1940번 주몽 C++ 투 포인터

리뷰투포인터를 통해 해결한 문제 문제 풀이n, m을 입력받고 정수형 벡터를 n크기로 초기화 해준 후 각 인덱스에 값을 받아와 준다.벡터를 정렬해 주고 투포인터에 벡터와 n, m값을 인자로 전해준다. (전역 변수를 사용해도 된다.)왼쪽의 시작 인덱스는 0, 오른쪽의 시작 인덱스는 n-1로 왼쪽이 오른쪽보다 커지기 전까지 루프를 실행한다.왼쪽과 오른쪽 인덱스의 값을 더해주고 m과 같다면 개수를 1개 찾은 것이다, 왼쪽 인덱스 + 1 오른쪽 인덱스 - 1만약 값이 더 클경우 오른쪽 인덱스를 -1 해주고, 값이 더 작을경우 왼쪽을 +1 해주면 된다.마지막으로 찾은 개수를 리턴해 준 뒤 출력해 준다. 참고 사항전역 변수를 사용하면 더 편리할수도?  정답 코드#include #include #include usin..

728x90