문제 요약
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
문제 분석
주어진 수를 정렬한 후 투포인터 방식으로 찾아간다.
코드
package Week15;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.StringTokenizer;
public class BOJ_1253 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] arr = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
int idx = 0;
while(st.hasMoreTokens()){
arr[idx++] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int answer = 0;
for(int curr = 0; curr < N; curr++){
int currNum = arr[curr];
int start = 0;
int end = N-1;
while(start < end){
int sum = arr[start] + arr[end];
// 두 수의 합이 현재 찾기위한 수보다 크다면
if(sum > currNum){
// end포인트를 왼쪽으로 옮겨준다.
end--;
}
// 두 수의 합이 현재 찾기위한 수보다 작다면
else if(sum < currNum){
// start포인트를 오른쪽으로 옮겨준다.
start++;
}
// 두 수의 합이 현재 찾기위한 수와 같다면
else{
// 두 수엔 0이 들어갈 수 있기 때문에
// 우연의 경우라도 두 수에 찾기위한 수가 들어가면 안된다.
if(curr == start){
start++;
}
else if(curr == end){
end--;
}
else{
answer++;
break;
}
}
}
}
System.out.println(answer);
}
}
정리
새로 배운 내용
없음
개선할 점
없음
더 찾아볼만한 사항
없음
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[Gold IV] 문자열 폭발 - 9935 (JAVA) (0) | 2023.06.29 |
---|---|
[Gold V] 숫자고르기 - 2668 (JAVA) (0) | 2023.06.26 |
[Gold IV] 전화번호 목록 - 5052 (JAVA) (0) | 2023.06.20 |
[Silver I] 효율적인 해킹 - 1325 (JAVA) (0) | 2023.06.03 |
[Gold V] A와 B - 12904 (JAVA) (0) | 2023.06.02 |