본문 바로가기

CodingTEST

[백준 1253] 좋다 (JAVA)

반응형

백준 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);
		
	}
}

 

반응형

'CodingTEST' 카테고리의 다른 글

[백준 17298번] 오큰 수 (JAVA)  (0) 2023.03.12
[백준 1874번] 스택 수열 (JAVA)  (1) 2023.03.08
[백준 11003번] 최솟값 찾기 (JAVA)  (0) 2023.03.06
[백준 12891] DNA 비밀번호 (JAVA)  (0) 2023.03.04
[백준 1940] 주몽 (JAVA)  (0) 2023.03.04