🤷♂️Algorithm
[백준 1253] 좋다 (투 포인터)
말동말동현
2024. 2. 29. 17:48
문제는 다음과 같다.
풀이
숫자 3은 1과2로 이루어지고 4는 3과1 ... 10은 1과9 로 합쳐지듯이 다른 수 두개의 합으로 나타낼 수 있다면 그 수를 좋은 수 라고하는 것이다. 이 문제를 풀기 위해선 정렬과 투 포인터를 이용하여 해결하면 된다.
for(k를 0부터 N까지 반복)
{
변수 초기화하기(찾고자 하는 값 find, 포인터 i, 포인터 j)
while(i < j)
{
if(A[i] + A[j] == 찾고자 하는 값)
두포인터 i,j가 k가 아닐때 결괏값에 반영 및 while 문 종료
두 포인터 i,j가 k가 맞을때 포인터 변경 및 계속 수행하기
else if(A[i] + A[j] < 찾고자 하는 값) 포인터 i 증가
else 포인터 j 감소
}
}
좋은수의 개수 출력하기
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
int[] A = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(A);
int result = 0;
for (int k = 0; k < N; k++) {
long find = A[k];
int i = 0;
int j = N-1;
while (i < j) {
if (A[i] + A[j] == find) {
if (i != k && j != k) {
result++;
break;
}
else if (i == k) {
i++;
}
else if (j == k) {
j--;
}
}
else if (A[i] + A[j] < find) {
i++;
}
else {
j--;
}
}
}
System.out.print(result);
}
}
느낀점
처음에 두번이나 실패했는데 그 이유가 i가 k와 같을때와 j가 k와 같을때를 생각을 못했다.