[백준]#1253 좋다

SeungBird·2021년 2월 13일
0

⌨알고리즘(백준)

목록 보기
280/401

문제

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

풀이

이 문제는 HashMap을 이용해서 풀 수 있었다. 부분부분 깊게 생각해봐야 하는 부분이 있기 때문에 여러 테스트케이스를 실행해봐야 할 것 같다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.HashSet;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        int cnt = 0;
        HashMap<Integer, Good> map = new HashMap<>();

        String[] input = br.readLine().split(" ");
        for(int i=0; i<N; i++) {
            arr[i] = Integer.parseInt(input[i]);

            if(map.containsKey(arr[i])) {
                map.get(arr[i]).idx.add(i);
            }

            else {
                HashSet<Integer> set = new HashSet<>();
                set.add(i);
                map.put(arr[i], new Good(false, set));
            }
        }

        for(int i=0; i<N-1; i++) {
            int a = arr[i];

            for(int j=i+1; j<N; j++) {
                int b = arr[j];
                int sum = a+b;

                if(map.containsKey(sum)) {
                    int flag = 0;
                    if(map.get(sum).idx.contains(i)) flag++;
                    if(map.get(sum).idx.contains(j)) flag++;

                    if(flag==0) map.get(sum).flag=true;

                    else {
                        if(map.get(sum).idx.size()>flag) map.get(sum).flag=true;
                    }
                }
            }
        }

        for(Good g : map.values()) {
            if(g.flag) cnt+=g.idx.size();
        }

        System.out.println(cnt);
    }

    public static class Good {
        boolean flag;
        HashSet<Integer> idx;

        public Good(boolean flag, HashSet<Integer> idx) {
            this.flag = flag;
            this.idx = idx;
        }
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글