문제 분류 수업 진도 대회 채점현황 순위 질문게시판
게임
스도쿠 타이핑 리듬 타자게임 타이핑 테트리스 타이핑 인베이더 타이핑 지뢰찾기 8192 공룡게임 타이핑 플래피버드 랭킹
로그인

8046 : 세 수의 합

•시간제한: 2.000 S •메모리제한: 256 MB •제출: 0 •통과: 0 •만든사람: suakii

8046 : 세 수의 합

시간 2.000s · 메모리 256MB · 제출 0 · 정답 0

문제 설명

크기가 $N$인 정수 배열과 목표 합 $X$가 주어집니다.
배열에서 서로 다른 세 위치(인덱스)의 원소를 선택하여 그 합이 정확히 $X$가 되도록 하는 프로그램을 작성하시오.



[제약 조건]
• $1 \le N \le 5{,}000$
• $1 \le X \le 10^9$
• $1 \le x_i \le 10^9$

입력 설명

첫째 줄에 배열의 크기 $N$과 목표 합 $X$가 공백으로 구분되어 주어집니다. ($1 \le N \le 5000$, $1 \le X \le 10^9$)
둘째 줄에 $N$개의 정수 $x_1, x_2, \ldots, x_N$이 공백으로 구분되어 주어집니다. ($1 \le x_i \le 10^9$)

출력 설명

조건을 만족하는 서로 다른 세 원소의 원래 인덱스(1-based)를 공백으로 구분하여 오름차순으로 출력합니다. 만약 그러한 세 수가 존재하지 않는다면 IMPOSSIBLE을 출력합니다. (답이 여러 개일 경우 아무거나 출력해도 인정됩니다.)

입력 예시
COPY
복사되었습니다!

4 8
2 7 5 1

출력 예시
COPY
복사되었습니다!

1 3 4

도움

정렬 후 투 포인터(Two Pointers) 기법을 활용해 $O(N^2)$ 시간에 해결할 수 있습니다.
배열의 원소들을 원래 인덱스와 쌍으로 묶어 값 기준으로 정렬합니다. 1번째 원소 i를 고정하고, 나머지 구간의 양끝을 l = i + 1, r = N - 1 포인터로 설정한 뒤 arr[l] + arr[r]의 합을 비교해가며 두 포인터를 좁힙니다. 합이 부족하면 l을 키우고, 목표 합을 초과하면 r을 줄이는 루프로 $O(N^2)$ 알고리즘을 설계할 수 있습니다.

출처/분류

NOTICE  —  BFStudy OJ 정보샘
애들아, 문제 많이 풀고 게임 잠깐 하는거지?
— 정보샘