티스토리 뷰

Algorithm/Baekjoon

백준 1253번 - 좋다

h7ung 2022. 11. 25. 17:18
728x90

문제링크

좋다 - 백준 1253

시간 제한 메모리 제한 정답 비율
2 초 256 MB 23.598%

문제

N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.

N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.

수의 위치가 다르면 값이 같아도 다른 수이다.

입력

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

출력

좋은 수의 개수를 첫 번째 줄에 출력한다.

예제 입력 1 복사

10
1 2 3 4 5 6 7 8 9 10

예제 출력 1 복사

8

힌트

3,4,5,6,7,8,9,10은 좋다.

 


문제 풀이 과정

이 문제는 투 포인터를 사용하여 해결해야한다.

이때 고려해야할 사항은 배열에 음수가 있을 경우를 고려해야한다.

음수를 고려하지 않고 코드 작성을 하여 계속 실패가 나왔다.

 

left 값을 0으로 시작하고 right 값을 i-1 로 하였더니 계속 실패가 나와 음수 고려를 생각하여 rightN-1 로 변경하였더니 바로 성공이 나왔다.

 

 

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt();
        long[] numbers = new long[N];
        int goodNum=0;
        for (int i = 0; i < N; i++) {
            numbers[i] = sc.nextLong();
        }

        Arrays.sort(numbers);

        for (int i = 0; i < N; i++) {
            long find = numbers[i];
            int left = 0;
            int right = N-1;
            while (left < right){
                if(i==left) left++;
                if(i==right) right--;
                if(left >= right) break;

                if(numbers[left] + numbers[right] < find){
                    left++;
                }
                else if(numbers[left] + numbers[right] > find){
                    right--;
                }
                else if(numbers[left] + numbers[right] == find){
                    goodNum++;
                    break;
                }
            }
        }


        System.out.println(goodNum);
    }
}

 

 

 

728x90

'Algorithm > Baekjoon' 카테고리의 다른 글

백준 1325번 - 효율적인 해킹 (JAVA)  (0) 2022.12.15
백준 7576번 - 토마토  (0) 2022.12.05
백준 10026번 - 적록색약  (0) 2022.12.05
백준 2606번 - 바이러스  (0) 2022.12.02
백준 11866번 - 요세푸스 문제  (0) 2022.11.28