해결 방법
A, B 벡터를 각각 오름차순으로 정렬해서 낮은 숫자를 가진 사람들부터 출전시켜가며, A팀에서 숫자가 낮은 사람들은 반드시 매칭이 이루어지도록 하는 식으로 접근하면 쉽게 해결할 수 있다.
A의 n번째 팀원을 an이라고 하고, B의 n번째 팀원을 bn이라고 하자.
A팀과 B팀의 각 첫 번째 사람인 a1, b1부터 출전시켜서 a1의 숫자가 더 크다면, b1는 A팀의 모든 뒷 사람들을 이길 수 없는 상태임을 알 수 있다. 왜냐하면 A를 오름차순으로 정렬해놓았기 때문이다. 그래서 B팀의 다음 사람(b2)을 출전시켜서 a1와 비교하면 된다.
만약에 b1의 숫자가 더 크다면 B팀의 승점을 1만큼 카운트하고 A팀과 B팀의 다음 사람을 출전시키면 된다. 그리고 매칭에 시도한 B의 팀원은 더 이상 매칭할 일이 없으니 B팀의 차례를 표시하는 변수를 추가해야 한다.
A, B의 범위는 각각 최대 10만이기 때문에, 반복문에서 더 이상의 반복이 필요가 없어졌을 때에는 break을 걸어줘야 시간 초과가 나지 않는다. a1, b1이 출전했을 때 b1의 숫자가 더 크다면, B팀의 팀원들은 방금 출전했던 a1과 더 이상 비교할 필요가 없어지므로 break로 반복문을 빠져나가면 된다.
위에 기술한 해결 방법을 입출력 예 #1에 적용해보자.
A팀의 팀원들이 가진 숫자는 각각 5, 1, 3, 7으로, 이를 정렬하면 [1, 3, 5, 7]이다.
B팀의 팀원들이 가진 숫자는 2, 2, 6, 8으로, 이미 정렬되어 있다.
Step1) a1<b1 -> 승점1
Step2) a2>b2
Step3) a2<b3 -> 승점2
Step4) a3<b4 -> 승점3
소스 코드
#include <vector>
#include <algorithm>
using namespace std;
int answer, point;
int solution(vector<int> A, vector<int> B) {
sort(A.begin(), A.end());
sort(B.begin(), B.end());
for(int i=0;i<A.size();i++){
for(int j=point;j<B.size();j++){
if(A[i]<B[j]) {
answer++;
point=j+1;
break; // 방금 출전했던 A[i]와는 더 이상 비교할 필요가 없어지므로 break로 반복문을 빠져나간다.
}
}
}
return answer;
}
정확성, 효율성 모두 만점
'Algorithm > Greedy' 카테고리의 다른 글
[그리디] 셔틀버스 - 2018 KAKAO BLIND RECRUITMENT (0) | 2022.05.28 |
---|---|
[그리디] 기지국 설치 - Summer/Winter Coding(~2018) (0) | 2022.04.26 |
[그리디] 튜플 - 2019 카카오 개발자 겨울 인턴십 (0) | 2022.04.10 |
[그리디] 추석 트래픽 - 2018 카카오 블라인드 채용 (0) | 2022.03.09 |
[그리디, 난이도 중] 프로그래머즈, 큰 수 만들기 (0) | 2020.10.05 |
댓글