🧩 BE
home

10816_숫자 카드 2

담당자
완료 여부
Solved
요약
날짜
2025/04/04
태그
이진탐색
난이도
S4
출처
백준
어제 풀었던 이분 탐색 문제와 같은 원리로, uppder bound와 lower bound의 차를 계산해서 중복 숫자를 또 탐색할 필요 없게해주면 된다. 이분 탐색은 좀 적응해서 풀만 했는데, 오히려 입출력쪽이 어려웠다.
hashMap으로 푸는 방법이 더 쉽다고 하니 시간나면 이 방법도 풀어볼 예정
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.StringTokenizer; // 이분 탐색 // 상한선 - 하한선으로 public class Main { static int N, M; static int[] cards; static int key; public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); N = Integer.parseInt(br.readLine()); cards = new int[N]; StringTokenizer st = new StringTokenizer(br.readLine(), " "); for (int i = 0; i < N; i++) { cards[i] = Integer.parseInt(st.nextToken()); } // 정렬해주기!! Arrays.sort(cards); M = Integer.parseInt(br.readLine()); st = new StringTokenizer(br.readLine(), " "); StringBuilder sb = new StringBuilder(); for (int i = 0; i < M; i++) { key = Integer.parseInt(st.nextToken()); // upperBound와 lowerBound의 차이 값 = 중복된 key의 개수 sb.append(upperBound(cards, key) - lowerBound(cards, key)).append(" "); } System.out.println(sb); } // key 이상 첫 위치 static int lowerBound(int[] arr, int key) { int left = 0; int right = arr.length; while (left < right) { int mid = (left + right) / 2; // key 값이 피벗보다 작거나 같으면 상계를 하향 if (key <= arr[mid]) { right = mid; } else { left = mid + 1; } } return left; } // key 초과 첫 위치 static int upperBound(int[] arr, int key) { int left = 0; int right = arr.length; while (left < right) { int mid = (left + right) / 2; // key 값이 피벗보다 작으면 상계를 하향 if (key < arr[mid]) { right = mid; // 중복 원소는 else에서 처리 } else { left = mid + 1; } } return left; } }
Java
복사
hashMap으로 푸는 방법이 더 쉽다고 하니 시간나면 이 방법도 풀어볼 예정