
문제
https://www.acmicpc.net/problem/1253
풀이
투 포인터를 활용해서 풀어야하는 문제이다.
값을 오름차순 정렬한다음, 가장 앞과 가장 뒤에 포인터를 위치시킨다.
포인터에 위치한 두 값을 더한 값이,
내가 선택한 값보다 크다면 -> 뒤의 포인터를 줄인다.
내가 선택한 값보다 작다면 -> 앞의 포인터를 늘린다.
포인터를 이동할 때 선택한 숫자는 선택이 안되야하므로 이 부분은 예외처리 해주면 된다.
코드
import java.util.*;
import java.io.*;
import java.util.stream.Collectors;
public class Main {
public Integer solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
int answer = 0;
List<Integer> numbers = new ArrayList<>(Arrays.asList(br.readLine().split(" ")))
.stream()
.map(Integer::parseInt)
.sorted()
.collect(Collectors.toList());
if(n < 3) return answer;
for (int i = 0; i < n; i++) {
int front = 0;
int back = n-1;
while (true) {
// 투 포인터를 설정한다.
if(front == i) front++;
if(back == i) back--;
if(front == back) break;
int result = numbers.get(front) + numbers.get(back);
int target = numbers.get(i);
if(result == target){
answer++;
break;
}
if(result > target) back--;
if(result < target) front++;
}
}
return answer;
}
public static void main(String[] args) throws Exception {
System.out.println(new Main().solution());
}
}
후기
풀고보면 단순한 투 포인터인데 놓칠부분이 은근 있는듯하다,,
'백준' 카테고리의 다른 글
2295 - 세 수의 합 (Java) (2) | 2024.10.03 |
---|---|
2493 - 탑 (Java) (0) | 2024.10.01 |
20955 - 민서의 응급 수술 (Java) (0) | 2024.10.01 |
1079 - 쇠 막대기 (Java) (0) | 2024.09.26 |
2116 - 주사위 쌓기 (Java) (1) | 2024.09.23 |