투 포인터

슬라이딩 윈도우 슬라이딩 윈도우란 일정한 길이를 이동시키면서 조건에 맞는 값을 찾는 알고리즘입니다. 배열에서 일정 범위의 합을 비교할 때 매우 유용한 방법으로, 값을 이동시킬 때 배열의 처음 값을 제거하고 배열의 마지막 값을 더해주기만 하면 되는데, 배열의 모든 값을 불러와서 더하는 연산을 피할 수 있어 매우 효율적입니다. 양 옆에 지점을 둔다는 점에서 투 포인터와 비슷한 점이 있지만, 투 포인터는 범위가 유동적으로 변하지만, 슬라이딩 윈도우는 범위가 고정되어 있다는 점이 차이점입니다. 다음은 투 포인터를 그림으로 표현한 예시입니다. 조건에 따라 범위가 유동적으로 변경되는 것을 볼 수 있습니다. 다음은 슬라이딩 윈도우를 그림으로 표현한 예시입니다. 범위는 항상 고정되어 있고, 배열은 좌우로만 이동합니다.
투 포인터 투 포인터란, 배열에서 원래 이중 for문으로 O(N^2)으로 처리되는 작업을 2개의 포인터를 통해 O(N)으로 해결해주는 알고리즘입니다. 여기서의 포인터는 C언어에서의 포인터의 개념이 아니라, 해당 지점을 의미하기 위해 사용되는 개념입니다. 이중 for문으로 처리할 때 주로 i가 계산되고, 그 안에서 j가 계산되는데, j가 계산될 때 i에 대한 정보가 쓰이지 않습니다. 하지만 투 포인터 같은 경우에는 i에 대한 정보를 사용하여 포인터를 이동시킵니다. 투 포인터 문제는 이분 탐색으로도 풀 수 있는 경우가 많고, 그 반대의 경우 또한 많습니다. 투 포인터 문제는 크게 두 가지 유형이 있습니다. 정렬 후 양 옆에서 다가오는 것 left, right를 지정하고, 상황에 따라 left나 right가 ..
· PS/BOJ
[Silver I] 겹치는 건 싫어 - 20922 문제 링크 성능 요약 메모리: 84644 KB, 시간: 88 ms 분류 두 포인터 문제 설명 홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 K개 이하로 들어 있는 최장 연속 부분 수열의 길이를 구하려고 한다. 100,000 이하의 양의 정수로 이루어진 길이가 N인 수열이 주어진다. 이 수열에서 같은 정수를 K개 이하로 포함한 최장 연속 부분 수열의 길이를 구하는 프로그램을 작성해보자. 입력 첫째 줄에 정수 N(1≤N≤200,000)과 K(1≤K≤100)가 주어진다. 둘째 줄에는 a1,a2,...an{a_1, a_2, ... a_n}이 주어진다 (1≤ai≤100..
· PS/BOJ
[Gold V] 두 용액 - 2470 문제 링크 성능 요약 메모리: 78352 KB, 시간: 64 ms 분류 이분 탐색, 정렬, 두 포인터 문제 설명 KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다. 산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다. 같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다. 이 연구소에서는 같은 양의 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 한다. 예를 들어, 주어진 용액들의 특성값이 [-2,..
· PS/BOJ
[Gold V] 용액 - 2467 문제 링크 성능 요약 메모리: 78392 KB, 시간: 72 ms 분류 이분 탐색, 두 포인터 문제 설명 KOI 부설 과학연구소에서는 많은 종류의 산성 용액과 알칼리성 용액을 보유하고 있다. 각 용액에는 그 용액의 특성을 나타내는 하나의 정수가 주어져있다. 산성 용액의 특성값은 1부터 1,000,000,000까지의 양의 정수로 나타내고, 알칼리성 용액의 특성값은 -1부터 -1,000,000,000까지의 음의 정수로 나타낸다. 같은 양의 두 용액을 혼합한 용액의 특성값은 혼합에 사용된 각 용액의 특성값의 합으로 정의한다. 이 연구소에서는 같은 양의 두 용액을 혼합하여 특성값이 0에 가장 가까운 용액을 만들려고 한다. 예를 들어, 주어진 용액들의 특성값이 [-99, -2, ..
· PS/BOJ
[Gold IV] 팀 빌딩 - 22945 문제 링크 성능 요약 메모리: 76296 KB, 시간: 44 ms 분류 두 포인터 문제 설명 개발자 N명이 팀 빌딩을 위해 한 줄로 서있다. 하나의 팀을 만들기 위해서는 개발자 2명이 반드시 모여야 한다. 개발자 A와 개발자 B가 팀을 만들 때 팀의 능력치는 아래와 같이 계산이 된다. (개발자 A와 개발자 B 사이에 존재하는 다른 개발자 수) × min(개발자 A의 능력치, 개발자 B의 능력치) 예를 들어, 4명의 개발자가 존재할 때, 각 개발자의 능력치를 1 4 2 5라고 하자. 이때 능력치가 1인 개발자와 능력치가 5인 개발자가 한 팀을 이뤘다고 가정하자. 그러면 이 팀의 능력치는 2×min(1,5)= 2가 된다. 팀 빌딩에서 나올 수 있는 팀 중 능력치의 최..
· PS/BOJ
[Gold V] 회문 - 17609 문제 링크 성능 요약 메모리: 83984 KB, 시간: 724 ms 분류 문자열, 두 포인터 문제 설명 회문(回文) 또는 팰린드롬(palindrome)은 앞 뒤 방향으로 볼 때 같은 순서의 문자로 구성된 문자열을 말한다. 예를 들어 ‘abba’ ‘kayak’, ‘reviver’, ‘madam’은 모두 회문이다. 만일 그 자체는 회문이 아니지만 한 문자를 삭제하여 회문으로 만들 수 있는 문자열이라면 우리는 이런 문자열을 “유사회문”(pseudo palindrome)이라고 부른다. 예를 들어 ‘summuus’는 5번째나 혹은 6번째 문자 ‘u’를 제거하여 ‘summus’인 회문이 되므로 유사회문이다. 여러분은 제시된 문자열을 분석하여 그것이 그 자체로 회문인지, 또는 한 ..
· PS/BOJ
[Silver III] 두 수의 합 - 3273 문제 링크 성능 요약 메모리: 76884 KB, 시간: 48 ms 분류 정렬, 두 포인터 문제 설명 n개의 서로 다른 양의 정수 a1, a2, ..., an으로 이루어진 수열이 있다. ai의 값은 1보다 크거나 같고, 1000000보다 작거나 같은 자연수이다. 자연수 x가 주어졌을 때, ai + aj = x (1 ≤ i < j ≤ n)을 만족하는 (ai, aj)쌍의 수를 구하는 프로그램을 작성하시오. 입력 첫째 줄에 수열의 크기 n이 주어진다. 다음 줄에는 수열에 포함되는 수가 주어진다. 셋째 줄에는 x가 주어진다. (1 ≤ n ≤ 100000, 1 ≤ x ≤ 2000000) 출력 문제의 조건을 만족하는 쌍의 개수를 출력한다. 풀이 투 포인터 문제로, 배열..
Dev_Ted
'투 포인터' 태그의 글 목록