문제 : 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();
}
}
'PS > BOJ' 카테고리의 다른 글
백준 11008 자바 - 복붙의 달인 (boj 11008 java) (0) | 2022.04.21 |
---|---|
백준 15738 자바 - 뒤집기 (boj 15738 java) (0) | 2022.04.20 |
백준 17550 자바 - Inquiry I (boj 17550 java) (0) | 2022.04.18 |
백준 17359 자바 - 전구 길만 걷자 (boj 17359 java) (0) | 2022.04.17 |
백준 15492 자바 - 뒤집기 (boj 15492 java) (0) | 2022.04.16 |
댓글