[백준(baekjoon) 2875] 대회 or 인턴
2018. 7. 14. 02:02ㆍAlgorithm
반응형
문제
N(1…100)명의 여자, M(1…100)명의 남자, 제외해야할 K(0…M+N)명이 주어질 때,
대회에 나가는 팀의 구성은 반드시 2명의 여자 + 1명의 남자가 되어야 한다.
이때, 대회에 나갈 수 있는 최대의 팀 수를 구하시오.
해결
두가지 방식으로 풀었다.
- 단순히
if
문과 연산만을 사용해K
값을0
으로 줄이는 방식
K
가M + N
보다 클 경우는 말할 필요도 없이0
이 답이다.2 : 1
비율로M
,N
을 비교해 적은 값(비율 1)이K
를 고려하지 않았을 때의 팀의 수가 된다.- 팀으로 확정되지 않은 나머지 사람 수를 구한다. 그리고 그 사람들을
K
에서 제외한다. - 그래도
K
가0
이상이라면, 제외할 팀의 수를 구해 기존 확정된 팀에서 빼준다.
제외할 팀의 수 = 팀의 단위가3
이므로 남은 사람에+ 2
를 해준 후3
을 나눈 수
(1
명을 제외할 때도,3
명을 제외할 때도1
팀을 빼야한다. 그러므로+ 2
를 해준다.)
K
값을 그대로 두고N
,M
을 비율대로 줄여나가 구하는 방식
- 아래 세가지 조건을 만족할 때 까지,
한 팀 = 여자 두명 & 남자 한명
씩 일일이 구한다.
M >= 2
: 여자가 2명 이상이다.N >= 1
: 남자가 1명 이상이다.M + N >= 3 + K
: 남은 사람들의 수가 제외할 사람들의 수 + 한 팀 이상이다.
- 아래 세가지 조건을 만족할 때 까지,
알고리즘
그리디 알고리즘을 사용해 해결하였다.
그리디 알고리즘에 대해 잘 모르신다면 이 글을 참고하세요!
구현 java
1) 방식
1.import java.util.*;
2.
3.public class Main {
4. public static void main(String[] args) {
5. Scanner sc = new Scanner(System.in);
6.
7. int n = sc.nextInt();
8. int m = sc.nextInt();
9. int k = sc.nextInt();
10.
11. int team = 0;
12. if (n + m > k) {
13. team = n / 2 < m ? n / 2 : m;
14. k -= (n + m) - team * 3; // rest 제외
15. if (k > 0) team -= (k + 2) / 3;
16. }
17. System.out.println(team);
18. }
19.}
2) 방식
1.import java.util.*;
2.
3.public class Main {
4. public static void main(String[] args) {
5. Scanner sc = new Scanner(System.in);
6.
7. int n = sc.nextInt();
8. int m = sc.nextInt();
9. int k = sc.nextInt();
10.
11. int team = 0;
12. while (n >= 2 && m >= 1 && n + m >= 3 + k) {
13. n -= 2;
14. m--;
15. team++;
16. }
17. System.out.println(team);
18. }
19.}
결과
- 단순히
if
문과 연산만을 사용해K
값을0
으로 줄이는 방식 K
값을 그대로 두고N
,M
을 비율대로 줄여나가 구하는 방식
조건을 만족할 때까지 while
문을 도는게 (2번) 단순히 연산을 사용한 방식 (1번) 보다 느릴줄 알았는데,
데이터 조건이 작아서 그런지 시간이 똑같다..
반응형