https://www.acmicpc.net/problem/1253
[정답 코드]
import org.w3c.dom.html.HTMLParagraphElement;
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int N = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
st = new StringTokenizer(br.readLine(), " ");
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int answer = 0;
for (int i = 0; i < N; i++) {
int left = 0;
int right = N - 1;
int target = arr[i];
while (left < right) {
int sum = arr[left] + arr[right];
if (sum == target) { // sum이 target과 같을 경우
if (left != i && right != i) { // left와 right가 같은 수가 아닐경우
answer++;
break;
} else if (left == i) { // 현재 탐색하려는 숫자를 사용하면 안됨
left++;
} else { // 현재 탐색하려는 숫자를 사용하면 안됨
right--;
}
} else if (sum < target) { //sum이 target보다 작을 경우
left++;
} else { // sum이 target보다 클 경우
right--;
}
}
}
System.out.println(answer);
}
}
[설명]
투 포인터로 풀었다. 배열을 입력받은 후 arr[left] 와 arr[right]를 더한값을 target 과 비교해가며 left를 늘리고 right를 줄이며 탐색한다.
if (left != i && right != i) { // left와 right가 같은 수가 아닐경우
answer++;
break;
} else if (left == i) { // 현재 탐색하려는 숫자를 사용하면 안됨
left++;
} else { // 현재 탐색하려는 숫자를 사용하면 안됨
right--;
}
여기서 else if 구문과 else 구문이 이해가 너무안가서 1시간 넘게 이해를 못하고있었다.
예를 들어 현재 3번 인덱스를 target으로 두고 탐색하고있을 때, 3번인덱스 + X인덱스를 더한값을 찾으려고 했을 경우라는 의미이다. 3번인덱스를 찾으려는데 3번인덱스를 더해서 찾는건 말이 안되기 때문이다.
'코딩테스트' 카테고리의 다른 글
백준 1987번: 알파벳[JAVA] (1) | 2024.04.03 |
---|---|
백준 1806번: 부분합[JAVA] (0) | 2024.04.02 |
백준 4485번: 녹색 옷 입은 애가 젤다지?[JAVA] (0) | 2024.04.02 |
백준 1189번: 컴백홈[JAVA] (0) | 2024.03.28 |
백준 15686번: 치킨 배달[JAVA] (0) | 2024.03.28 |