이 문제는 그리디 알고리즘으로 분류되어 있다.
그리디는, 매순간 최선의 선택을 하는 알고리즘인데 이 문제에서 어떤 의도로 사용하라고 했는지는 잘 모르겠다.
문제를 풀기 위해서 다음의 과정을 거쳤다.
1. 최대 만들 수 있는 팀의 수를 구하기
2. 최대 만들 수 있는 팀 이외의 인원들을 K에 사용하기('-' 연산)
3. 2를 실시한 후에, K에 해당되는 인원이 아직도 남아있다면 팀을 해체시키기
위의 세 과정을 코드로 작성하였다.
구글링을 해보면 대부분 While문을 이용한 코드를 작성했다.
While문을 이용한 코드는 N과 M이 크다면, 시간복잡도가 증가해서 효율성이 떨어지기 때문에, 아래의 코드가 더 효율적이라고 볼 수 있다.
해설코드(C++).
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
#include <iostream>
using namespace std;
int main() {
int N, M, K;
cin >> N >> M >> K;
int answer;
if(N / 2 >= M){
answer = M;
if(N - (2 * M) < K)
{
K -= (N - (2 * M));
answer -= (K + 2) / 3;
}
}else{
answer = N / 2;
if(M - N / 2 < K){
K -= (M - (N / 2));
answer -= (K + 2) / 3;
}
}
cout << answer << endl;
return 0;
}
|
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ 1946] 신입사원 (0) | 2020.06.14 |
---|---|
[BOJ 7453] 합이 0인 네 정수 (0) | 2020.06.13 |
[BOJ 1316] 그룹 단어 체커 (0) | 2020.06.07 |
[BOJ 1062] 가르침(시간초과, C++, 40% 틀린이유) (0) | 2020.06.07 |
[BOJ 1541] 잃어버린 괄호 (0) | 2020.06.04 |