CS 기초 · 중급
두 개의 포인터(Two Pointers) 기법이 어떤 문제들을 효과적으로 해결할 수 있는지 두 가지 예시를 들고, 각 예시에서 이 기법이 어떻게 적용되는지 설명해주세요.
힌트 · 정렬된 배열에서 합이 특정 값이 되는 두 수 찾기나, 회문(palindrome) 검사 등에서 유용하게 사용됩니다.
정렬투 포인터선형 탐색공간 복잡도시간 복잡도
모범답안
두 포인터 기법은 주로 배열이나 연결 리스트에서 특정 조건을 만족하는 요소를 효율적으로 찾을 때 유용합니다.
첫 번째 예시는 정렬된 배열에서 합이 특정 값 target이 되는 두 수를 찾는 문제입니다. 배열의 양 끝에 포인터 두 개를 두고, 두 포인터가 가리키는 값의 합이 target보다 작으면 왼쪽 포인터를 오른쪽으로, 크면 오른쪽 포인터를 왼쪽으로 이동시키면서 탐색합니다. 이 방법은 O(n)의 시간 복잡도로 문제를 해결할 수 있습니다.
두 번째 예시는 문자열이 회문인지 확인하는 문제입니다. 문자열의 처음과 끝에 포인터를 두고, 두 포인터가 가리키는 문자가 서로 다르면 회문이 아니고, 같으면 포인터를 안쪽으로 이동시키면서 비교합니다. 이 역시 O(n)의 시간 복잡도로 회문 여부를 판단할 수 있습니다. 두 포인터 기법은 추가적인 공간을 사용하지 않아 공간 복잡도도 O(1)입니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 알고리즘 면접 질문
- 해시 테이블(Hash Table)에서 해시 충돌(Hash Collision)이 발생했을 때 이를 해결하는 대표적인 방법 두 가지를 설명하고, 각각의 장단점을 비교해주세요.
- 이진 탐색 트리(BST)에서 중위 순회(Inorder Traversal)가 어떤 특징을 가지며, 이를 활용하여 어떤 문제를 해결할 수 있는지 설명해주세요.
- 우선순위 큐(Priority Queue)를 구현할 때 힙(Heap) 자료구조를 사용하는 주된 이유와, 힙의 삽입 및 삭제 연산이 어떻게 동작하는지 설명해주세요.
- 대규모 데이터셋에서 동적 계획법(Dynamic Programming)을 적용할 때, DP 테이블의 크기가 너무 커지거나 상태 전이 비용이 높아져 발생하는 성능 문제를 해결하기 위한 고급 최적화 기법(예: Convex Hull Trick, Divide and Conquer Optimization, Monotonic Queue Optimization)들을 설명하고, 각 기법이 어떤 형태의 점화식에 적용될 수 있는지 구체적인 예시를 들어 설명하시오.
- 네트워크 플로우(Network Flow) 문제 해결을 위한 알고리즘 중 Dinic 알고리즘이 Edmonds-Karp나 Ford-Fulkerson 알고리즘에 비해 실제 환경에서 훨씬 효율적인 이유를 설명하고, Dinic 알고리즘의 핵심 단계인 레벨 그래프 구성과 블로킹 플로우(Blocking Flow)를 찾는 과정을 자세히 설명하시오.
- 대용량 텍스트 데이터에서 모든 반복되는 부분 문자열을 효율적으로 찾거나, 두 문자열의 최장 공통 부분 문자열(Longest Common Substring)을 찾는 문제에 Suffix Array와 Suffix Tree를 어떻게 적용할 수 있는지 설명하고, 두 자료구조의 구현 복잡도, 공간 효율성, 그리고 특정 문제 해결에 있어서의 장단점을 비교 분석하시오.