-
다른 사람 블로그를 참고해서 풀었다.
두 포인터를 활용하였다.
1) 풀이 예시
5 =N
1 2 3 5 8 => number 배열에 오름차순 정렬하여 입력.
를 생각해보자.
2) 3이 좋다 조건을 만족할까?
먼저 3이 좋다 조건을 만족하는지 생각해보자.
일단 두 포인터로 변수 one, two 를 사용한다.
처음에
one = 0, two = N-1 = 4
=> number[one] = 1, number[two] = 8
=> sum = number[one] + number[two] = 9
3을 변수 value 에 입력한다.
=> value = 3
value (3) < sum(9) 이므로,
sum 값을 줄여야 value 에 가까워진다.
number 배열을 오름차순 정렬했기 때문에, sum 을 줄이려면 two 인덱스를 감소시켜야 한다.
=> two--
그러면
one = 0, two = 3
=> number[0] = 1, number[two] = 5
=> sum = 6
value = 3
value < sum 이므로 역시 two 인덱스를 줄여나가면서 value = sum 을 만족할 때까지 하면 된다.
3) 5가 좋다 조건을 만족할까?
위의 예시를 이어서 풀이한다.
5
1 2 3 5 8
이 경우도 시작은 one = 0, two = 4
sum = number[one] + number[two] = 9
value = 5
value < sum 이므로 two 인덱스를 줄인다.
one = 0, two = 3
그런데, 좋다 조건을 만족하려면 자기 자신이 아닌 다른 두개의 합을 구해야 한다.
그런데 숫자 5의 인덱스는 3으로 two 와 같다.
그래서 이 경우는 two를 한 번 더 감소시킨다.
one = 0, two = 2
sum = number[one] + number[two] = 4
value > sum 이므로, sum 을 증가시켜야 value 에 가까워질 수 있다.
그래서 이번에는 one 인덱스를 증가시킨다.
one = 1, two = 2
sum = number[one] + number[two] = 5
sum = value 이므로 숫자 5는 좋다 조건을 만족한다.
4) 최종 코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; 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 number []= new int [N]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); for(int i=0; i<N; i++) { number[i] = Integer.parseInt(st.nextToken()); } Arrays.sort(number); int count = 0; for(int i=0; i<N; i++) { int one = 0; int two = N-1; while(one<two) { if(one==i) { one++; continue; } if(two==i) { two--; continue; } int sum = number[one]+ number[two]; int value = number[i]; if(value == sum) { count++; break; } if(value<sum ) { two--; }else if(value>sum) { one++; } } } System.out.println(count); } }
참고 블로그 : https://coder-in-war.tistory.com/entry/BOJ-JAVA1253-%EC%A2%8B%EB%8B%A4
[ BOJ ][JAVA][1253] 좋다
https://www.acmicpc.net/problem/1253 1253번: 좋다 첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수) www.acmicpc.net..
coder-in-war.tistory.com