10816번: 숫자 카드 2
첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0
www.acmicpc.net
풀이 과정
- 중복 원소의 개수를 구해야 함
- 중복 원소의 왼쪽 끝 값과 오른쪽 끝 값을 각각 알아내는
- lower_bound /Upper_bound를 이용
- 중복 원소에 대한 길이 = (상한 - 하한)
[C언어 / 백준 - 10816] 숫자 카드2 / lower_bound, Upper_bound (tistory.com)
[C언어 / 백준 - 10816] 숫자 카드2 / lower_bound, Upper_bound
www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적
wonsjung.tistory.com
이분 탐색
- 정렬된 수를 분할하여 찾고자 하는 k값의 index를 찾는 알고리즘
lower_bound
- 정렬된 수들 중 찾고자 하는 k 이상의 최초값 index를 찾는 알고리즘
- 찾고자 하는 값 이상의 값이 처음으로 나타나는 위치
Upper_bound
- 정렬된 수들 중 찾고자 하는 k를 초과한 최초값의 index를 찾는 알고리즘
- 찾고자 하는 값을 초과한 값을 처음 만나는 위치
정답
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
//Lower Bound = 일치하는 숫자가 처음 나타나는 지점
public static int Lower_bound(int target[] , int key)
{
int start = 0;
int end = target.length;
while(start<end)
{
int mid = (start+end)/2;
if(key<=target[mid])
{
end = mid;
}
else
{
start = mid+1;
}
}
return start;
}
//Upper Bound = 일치하는 숫자 다음 수가 나타나는 지점
public static int Upper_bound(int target[], int key)
{
int start = 0;
int end = target.length;
while(start<end)
{
int mid = (start+end)/2;
if(key<target[mid])
{
end = mid;
}
else
{
start = mid+1;
}
}
return start;
}
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
int card[] = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++)
{
card[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(card);
int m = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
for(int i=0; i<m; i++)
{
int key = Integer.parseInt(st.nextToken());
bw.write(Upper_bound(card,key)- Lower_bound(card,key)+" ");
}
bw.flush();
bw.close();
}
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 13909 창문 닫기 (0) | 2024.02.13 |
---|---|
[JAVA] 백준 1764 듣보잡 (0) | 2024.02.13 |
[JAVA] 백준 7785 회사에 있는 사람 (1) | 2024.02.12 |
[JAVA] 백준 14425 문자열 집합 (0) | 2024.02.12 |
[JAVA] 백준 17103 골드바흐 파티션 (0) | 2024.02.10 |