CodingTEST
[백준 1253] 좋다 (JAVA)
경걍
2023. 3. 4. 02:05
반응형
백준 1253번 문제 - 좋다
1253번: 좋다
첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)
www.acmicpc.net
문제 분석
- N과 N개의 수를 입력
- 입력받은 수를 다른 입력받은 두 개의 수의 합으로 나타낼 수 있는 수 → "좋은 수"
- "좋은 수"의 개수를 출력
해결 키 포인트
- 배열 정렬 - Arrays.sort() 함수 이용
- 투 포인트 사용
생각하지 못한 반례
- 두수에는 확인하고자 하는 자신의 수는 포함하지 않음
입력 | 출력 |
3 0 0 1 |
0 |
입력 값에는 음수 값이 존재할 수 있음
입력 | 출력 |
5 0 -1 -1 1 1 |
5 |
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;
public class Main {
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 개수 N을 입력
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
Long numArray[] = new Long [N];
// N개의 수를 입력
st = new StringTokenizer(br.readLine());
for(int i=0;i<N;i++) {
numArray[i] = Long.parseLong(st.nextToken());
}
// N개의 수를 정렬
Arrays.sort(numArray);
// 필요한 index 변수 선언 (start, end, check) | 좋은 수 개수 변수 선언 (count)
int start = 0, end = N-1, check = N-1, count = 0;
/* 다음부터 말하는 start, end, check는 numArray[start], numArray[end], numArray[check]를 의미 */
// start는 증가시키고, end는 감소심키면서 이들의 합을 check와 비교하면서 좋은 수의 개수 구하기
// check가 0보다 작아질 때 까지 반복 -> N-1인덱스부터 0인덱스 까지 확인
while(check>=0) {
if(check==end) // check==end : 자신을 더하는 수 중 하나로 할 때는 예외로 둬야함
end--;
else if(check==start) // check==start : 자신을 더하는 수 중 하나로 할 때는 예외로 둬야함
start++;
else if(start>=end) { // start>=end : 확인할 수 있는 경우의 수 다 확인
// 확인하는 수 변경 | start, end index 재조정
check--;
end=N-1;
start=0;
}
else if(numArray[start]+numArray[end] > numArray[check]) // start+end > check : 합이 확인하는 수보다 큰 경우
end--; // 합을 줄이기 위해 end index 감소
else if(numArray[start]+numArray[end] < numArray[check]) // start+end < check : 합이 확인하는 수보다 작은 경우
start++; // 합을 증가시키기 위해 start index 증가
else { // start+end == check (좋은 수)
// 좋은 수 개수 증가 | 확인하는 수 변경 | start, end index 재조정
count++;
check--;
end=N-1;
start=0;
}
}
System.out.println(count);
}
}
반응형