본문 바로가기
PS/BOJ

백준 1940 자바 - 주몽 (boj 1940 java)

by Nahwasa 2022. 4. 19.

문제 : boj1940

 

  고유한 번호를 a라고 할 때, 결국 알아야 하는 것은 n개의 a에 대해 현재 보고 있는 a값을 기준으로 m-a가 n개 중에 존재하는지만 알 수 있으면 된다.

 

  따라서 HashSet을 사용하면 쉽게 풀 수 있다. 이 때, 만약 '고유한 번호'가 아니라 중복되는 것이었다면 HashMap으로 개수도 체크해야 했을 것이다.

 

  로직은 그럼 다음과 같다.

A. N개를 입력받으면서 HashSet에 넣는다.

B. N개를 순회하면서 m-a가 HashSet에 존재하는지 확인한다. 존재한다면 카운트를 +1 시킨다.

C. 이 때 m이 짝수이고 m/2인 값이 존재한다면 m-a == a 이므로 이 경우는 빼야하니 카운트 -1 시킨다.

D. 최종적으로 중복된 경우를 빼기 위해 카운트/2를 해서 출력해주면 된다.

 

코드 : github

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
    private void solution() throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int m = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] arr = new int[n];
        HashSet<Integer> hs = new HashSet<>();
        for (int i = 0; i < n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            hs.add(arr[i]);
        }
        int cnt = 0;
        for (int i = 0; i < n; i++) {
            if (hs.contains(m-arr[i]))
                cnt++;
        }
        if (m%2==0 && hs.contains(m/2))
            cnt--;
        System.out.println(cnt/2);
    }
    public static void main(String[] args) throws Exception {
        new Main().solution();
    }
}

댓글