728x90
![[BOJ] 1253 좋다 - JAVA [BOJ] 1253 좋다 - JAVA](http://t1.daumcdn.net/tistory_admin/static/images/xBoxReplace_250.png)
1. 문제
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)...
www.acmicpc.net
N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.
N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.
수의 위치가 다르면 값이 같아도 다른 수이다.
2. 풀이
1. 입력받은 배열을 정렬한다.
2. 배열 요소를 하나씩 찾는다. left = 0, right = N-1로 두고 탐색한다.
3. sum = arr[left] + arr[right]이다.
3-1. sum > find 라면 더 작아져야하므로 right--한다.
3-2. sum < find 라면 더 커져야하므로 left++한다.
3-3. sum == find이지만 left == i 이거나 right == i 인 경우 해당 위치를 한칸씩 옮긴다.
3-4. 그밖의 경우는 답이다. 따라서 answer++한다.
4. answer을 출력한다.
import java.io.*; import java.util.*; public class BOJ_1253_좋다 { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); int N = Integer.parseInt(in.readLine()); int[] arr = new int[N]; StringTokenizer st = new StringTokenizer(in.readLine()); for (int i = 0; i < N; i++) arr[i] = Integer.parseInt(st.nextToken()); Arrays.sort(arr); int find, answer = 0; for (int i = 0; i < N; i++) { find = arr[i]; int left = 0, right = N - 1, sum; while (left < right) { sum = arr[left] + arr[right]; if (sum > find) right--; else if (sum < find) left++; else if (left == i) left++; else if (right == i) right--; else { answer++; break; } } } System.out.println(answer); } }
3. 결과
![[BOJ] 1253 좋다 - JAVA - 3. 결과 [BOJ] 1253 좋다 - JAVA - 3. 결과](http://t1.daumcdn.net/tistory_admin/static/images/xBoxReplace_250.png)
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 17609 회문 - JAVA (0) | 2023.03.26 |
---|---|
[BOJ] 2473 세 용액 - JAVA (0) | 2023.03.25 |
[BOJ] 1644 소수의 연속합 - JAVA (0) | 2023.03.23 |
[BOJ] 20920 영단어 암기는 괴로워 - JAVA (0) | 2023.03.22 |
[BOJ] 20922 겹치는 건 싫어 - JAVA (0) | 2023.03.21 |
댓글