Algorithm/Baekjoon
[Baekjoon 백준] 1253 좋다 - Java
뭐든 해보기
2023. 1. 28. 19:20
문제) N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 "좋다(GOOD)"고 한다. N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
입력) 첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
출력) 좋은 수의 개수를 첫 번째 줄에 출력한다.
1. 변수 선언(N, M)
2. 주어진 수 배열에 저장, 정렬
3. 주어진 수 만큼 반복하면서 인덱스 배열의 합으로 좋은 수 찾기
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine()); // 수의 개수 (|Ai| ≤ 1,000,000,000)
long A[] = new long[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<N; i++) {
A[i] = Long.parseLong(st.nextToken());
}
Arrays.sort(A);
int count = 0; //좋은 수 개수
for(int i=0; i<N; i++) { //주어진 수만큼
long K = A[i]; //찾을 수
int startIndex = 0;
int endIndex = N-1;
while(startIndex<endIndex) {
long sum = A[startIndex] + A[endIndex];
if(sum == K) { //두 포인터 합이 찾을 수랑 같을 때 => 좋은 수 대상
if(startIndex != i && endIndex != i) { //자신 제외 일 때만 좋은 수
count++;
break;
}
else if(startIndex == i) { //시작 포인터가 i인 경우 ++
startIndex++;
}
else if(endIndex == i) { //종료 포인터가 i인 경우 --
endIndex--;
}
}
else if(sum > K) { //찾을 수보다 합이 크면 종료 포인터 --
endIndex--;
}
else {
startIndex++; //찾을 수보다 합이 작으면 시작 포인터 ++
}
}
}
System.out.println(count);
}
자기 자신은 제외한 수의 답을 찾으면서 투 포인터를 상황에 맞게 변경시켜준다.
어렵당.