Programmers-숫자 게임
2021-03-29
위 문제는 Programmers 숫자 게임 문제에 관한 설명입니다.
문제 설명
xx 회사의 2xN명의 사원들은 N명씩 두 팀으로 나눠 숫자 게임을 하려고 합니다.
두 개의 팀을 각각 A팀과 B팀이라고 하겠습니다.
숫자 게임의 규칙은 다음과 같습니다.
- 먼저 모든 사원이 무작위로 자연수를 하나씩 부여받습니다.
- 각 사원은 딱 한 번씩 경기를 합니다.
- 각 경기당 A팀에서 한 사원이, B팀에서 한 사원이 나와 서로의 수를 공개합니다. 그때 숫자가 큰 쪽이 승리하게 되고, 승리한 사원이 속한 팀은 승점을 1점 얻게 됩니다.
- 만약 숫자가 같다면 누구도 승점을 얻지 않습니다.
전체 사원들은 우선 무작위로 자연수를 하나씩 부여받았습니다.
그다음 A
팀은 빠르게 출전순서를 정했고 자신들의 출전 순서를 B
팀에게 공개해버렸습니다.
B
팀은 그것을 보고 자신들의 최종 승점을 가장 높이는 방법으로 팀원들의 출전 순서를 정했습니다.
이때의 B
팀이 얻는 승점을 구해주세요.
A
팀원들이 부여받은 수가 출전 순서대로 나열되어있는
배열 A
와 i번째 원소가 B
팀의 i번 팀원이 부여받은 수를 의미하는 배열 B
가 주어질 때,
B
팀원들이 얻을 수 있는 최대 승점을 return 하도록 solution 함수를 완성해주세요.
제한사항
A
와B
의 길이는 같습니다.A
와B
의 길이는 1 이상 100,000 이하입니다.A
와B
의 각 원소는 1 이상 1,000,000,000 이하의 자연수입니다.
import java.util.*;
class Solution {
public int solution(int[] A, int[] B) {
int answer = 0;
Arrays.sort(A);
Arrays.sort(B);
int index = 0;
for(int i=0; i<A.length; i++){
for(int j=index; j<B.length; j++){
if(A[i] < B[j]){
answer++;
index = j+1;
break;
}
}
}
return answer;
}
}
이번 문제는 효율성을 고려해야 하는 문제였습니다.
처음에 문제만 보고 브루트 포스로 풀었다가 효율성에서 문제가 생겼습니다.
이유는 제한사항의 길이였습니다.
그래서 좀 더 효율성을 살릴 방법을 고민했습니다.
A와 B를 모두 오름차순으로 정렬하는 방법을 사용해주고,
A 작은 수부터 B와 비교를 해주는데 이때 B의 배열을 하나씩 증가하면서 해줍니다.
B 배열의 index 시작 값은 A[i] < B[j] 보다 큰 경우가 됬을 때 index = j+1 이 되게 됩니다.
왜냐하면 해당 A[i]와 매칭 된게 B[j]이기 때문입니다.