백준

백준 1253번 자바 ☆

ahlight 2022. 12. 30. 20:02

문제

https://www.acmicpc.net/problem/1253

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

import java.util.Arrays;
import java.util.Scanner;

public class Main1253 {

	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();
		int[] arr = new int [N];
		boolean[] visited = new boolean[N];
		
		for (int i=0; i<N; i++) {
			arr[i] = sc.nextInt();
		}
		
		Arrays.sort(arr);
		
		int cnt = 0;
		
		for (int i = 0; i<N; i++) {
			int si = 0;
			int ei = N-1;
			while (si < ei) {
				if (arr[si] + arr[ei] == arr[i]) {
					if (si != i && ei != i) {
						cnt++;
						break;
					} else if (si == i) {
						si++;
					} else {
						ei--;
					}
					
				} else if (arr[si] + arr[ei] < arr[i]) {
					si++;
				} else {
					ei--;
				}
			}
			
		}
		
		System.out.println(cnt);
	}
}

1. 문제이해를 잘못해서 양수만 생각하고 로직을 구성했다. 그렇게 헤매다 결국 절대값인것을 확인하고 다시 로직을 짰다.

 

2. 투포인터를 활용한다. 다만 음수가 있기때문에 si(startIndex), ei(endIndex)의 값이 i와 같을 수 있는 반례를 예상해야 한다. 그 외엔 딱히 어려운 부분은 없다.

 

정리 : 골드치고 어려운 문제는 아니지만 위에 설명한 반례를 생각 못한다면 쉽게 풀 수 없었을 문제다. 항상 문제를 꼼꼼히 읽는 습관을 길들이자.