2023. 4. 27. 20:13ㆍBaekjoon
https://www.acmicpc.net/problem/2923
2923번: 숫자 게임
창영이와 현우는 새로운 게임을 하고 있다. 이 게임은 여러 라운드로 이루어져 있다. 매 라운드가 시작할 때, 현우는 창영이에게 100보다 작은 두 숫자 A와 B를 말해준다. 그러고 난 뒤, 창영이는
www.acmicpc.net
- 문제 요약
창영이와 현우는 여러 라운드로 이루어진 게임을 하고 있다.
매 라운드가 시작할 때, 현우는 창영이에게 100보다 작은 두 숫자 A와 B를 말해준다.
그러고 난 뒤, 창영이는 다음과 같은 문제를 풀어야 한다.
지금까지 현우가 말한 모든 A와 모든 B를 짝짓는다.
이때, 각 쌍의 합 중에서 가장 큰 값을 작게 만들어라.
즉, 현재 라운드가 N 라운드이라고 하면, 현우가 창영이에게 말한 숫자는 a1, a2,..., an과 b1, b2,..., bn이라고 할 수 있다. 이때, 각 숫자를 한 번씩 사용하여 (ai, bj) 쌍을 n개 만들 수 있다.
이렇게 쌍을 모두 만들었을 때, ai+bj의 합 중 가장 큰 값을 가능한 작게 만들어야 한다.
- 알고리즘 정리
A에서 가장 큰 값과 B에서 가장 작은 값을 더하는 것은 가장 큰 값이 아니라고 가정했습니다.
현우가 말한 숫자 는 A와 B가 입력으로 들어올 때, 현재까지 들어온 A 중 가장 큰 값과 B를 더하는 식으로 그리디 하게 문제를 해결했습니다.
- 코드 작성
#include<bits/stdc++.h>
using namespace std;
#define MAX 101
int n,arr[MAX],brr[MAX],result,mx,mn;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n;
for(int i=0;i<n;i++){
int a,b;
cin>>a>>b;
vector<int>v1(MAX),v2(MAX);
arr[a]++;
brr[b]++;
for(int j=0;j<MAX;j++){
v1[j]=arr[j];
v2[j]=brr[j];
}
result=0,mx=100,mn=1;
while(mx>=1&&mn<MAX){
while(mx>=1&&v1[mx]==0){
mx--;
}
while(mn<MAX&&v2[mn]==0){
mn++;
}
if(mx==0||mn==MAX){
break;
}
result=max(result,mx+mn);
if(v1[mx]>v2[mn]){
v1[mx]-=v2[mn];
v2[mn]=0;
}
else{
v2[mn]-=v1[mx];
v1[mx]=0;
}
}
cout<<result<<'\n';
}
}
오늘의 한 줄 : 내다버린 10분 (변수 이름은 잘 알아볼 수 있도록 지어봅시다...^^)
'Baekjoon' 카테고리의 다른 글
[BOJ 14428] 수열과 쿼리 16 (0) | 2023.04.29 |
---|---|
[BOJ 14427] 수열과 쿼리 15 (0) | 2023.04.28 |
[BOJ 2613] 숫자구슬 (0) | 2023.04.26 |
[BOJ 15971] 두 로봇 (1) | 2023.04.25 |
[BOJ 20188] 등산 마니아 (0) | 2023.04.24 |