문제 출처 : https://www.acmicpc.net/problem/7795
7795번: 먹을 것인가 먹힐 것인가
심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을
www.acmicpc.net
문제 :

풀이 :
T만큼 반복하는 반복문 안에서 N, M과 각 배열 입력받는다.
그리고 각 케이스마다 정답 리턴하는 함수 작성하고 사용한다.
arrA, arrB 정렬한 다음 arrA 기준으로 for문 돌리고
그 안에서 이분 탐색 알고리즘 이용해 arrA[i]보다 작은 arrB 개수들 계산해서 구하고자 하는 값 리턴시킨다.
소스코드 :
import java.util.*;
class Main {
public int solution(int n, int m, int[] arrA, int[] arrB) {
int cnt = 0;
Arrays.sort(arrA);
Arrays.sort(arrB);
for(int i=0; i<n; i++) {
int lt = 0, rt = m-1, idx = 0;
while (lt <= rt) {
int mid = (lt + rt) / 2;
if (arrA[i] > arrB[mid]) {
lt = mid + 1;
idx = mid + 1;
}
else rt = mid - 1;
}
cnt += idx;
}
return cnt;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i=0; i<t; i++) {
int n = sc.nextInt();
int m = sc.nextInt();
int[] arrA = new int[n];
int[] arrB = new int[m];
for(int j=0; j<n; j++) {
arrA[j] = sc.nextInt();
}
for(int k=0; k<m; k++) {
arrB[k] = sc.nextInt();
}
System.out.println(T.solution(n, m, arrA, arrB));
}
}
}
'Java 코딩테스트 공부 > Java 백준 문제풀이' 카테고리의 다른 글
자바/C++ 백준 2805번 문제 : 나무 자르기 (1) | 2022.11.04 |
---|---|
자바 백준 1874번 문제 - 스택 수열 (0) | 2022.11.03 |
자바 백준 10828, 10845, 10866번 문제 - 스택, 큐, 덱 (0) | 2022.10.21 |
자바 백준 1181번 문제 - 단어정렬 (0) | 2022.10.21 |
자바 백준 2108번 문제 - 통계학 (0) | 2022.10.20 |
문제 출처 : https://www.acmicpc.net/problem/7795
7795번: 먹을 것인가 먹힐 것인가
심해에는 두 종류의 생명체 A와 B가 존재한다. A는 B를 먹는다. A는 자기보다 크기가 작은 먹이만 먹을 수 있다. 예를 들어, A의 크기가 {8, 1, 7, 3, 1}이고, B의 크기가 {3, 6, 1}인 경우에 A가 B를 먹을
www.acmicpc.net
문제 :

풀이 :
T만큼 반복하는 반복문 안에서 N, M과 각 배열 입력받는다.
그리고 각 케이스마다 정답 리턴하는 함수 작성하고 사용한다.
arrA, arrB 정렬한 다음 arrA 기준으로 for문 돌리고
그 안에서 이분 탐색 알고리즘 이용해 arrA[i]보다 작은 arrB 개수들 계산해서 구하고자 하는 값 리턴시킨다.
소스코드 :
import java.util.*;
class Main {
public int solution(int n, int m, int[] arrA, int[] arrB) {
int cnt = 0;
Arrays.sort(arrA);
Arrays.sort(arrB);
for(int i=0; i<n; i++) {
int lt = 0, rt = m-1, idx = 0;
while (lt <= rt) {
int mid = (lt + rt) / 2;
if (arrA[i] > arrB[mid]) {
lt = mid + 1;
idx = mid + 1;
}
else rt = mid - 1;
}
cnt += idx;
}
return cnt;
}
public static void main(String[] args) {
Main T = new Main();
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
for(int i=0; i<t; i++) {
int n = sc.nextInt();
int m = sc.nextInt();
int[] arrA = new int[n];
int[] arrB = new int[m];
for(int j=0; j<n; j++) {
arrA[j] = sc.nextInt();
}
for(int k=0; k<m; k++) {
arrB[k] = sc.nextInt();
}
System.out.println(T.solution(n, m, arrA, arrB));
}
}
}
'Java 코딩테스트 공부 > Java 백준 문제풀이' 카테고리의 다른 글
자바/C++ 백준 2805번 문제 : 나무 자르기 (1) | 2022.11.04 |
---|---|
자바 백준 1874번 문제 - 스택 수열 (0) | 2022.11.03 |
자바 백준 10828, 10845, 10866번 문제 - 스택, 큐, 덱 (0) | 2022.10.21 |
자바 백준 1181번 문제 - 단어정렬 (0) | 2022.10.21 |
자바 백준 2108번 문제 - 통계학 (0) | 2022.10.20 |