문제 출처: https://www.acmicpc.net/problem/13458
풀이
각 시험장에 총 감독관은 1명만 있어야하므로, 정답을 구할 때는 총감독관1명을 배치하고 남는 인원들에 대해서 부감독관을 구하는게 제일 빠릅니다.
그렇기 때문에 그리디 알고리즘문제라고 할 수 있겠습니다.
길게 풀이를 적어내면 이해가 더 안갈 것같아 최대한 간략하게 풀이순서대로 작성해봤습니다.
1. ans는 int형이 아닌 longlong형으로 선언해야한다.
b,c가 1이고 각 시험장에 1,000,000씩 있으면 int형으로 표현불가
2. 총감독관부터 배치한다.
num[i]>=b, num[i]==b, num[i]<b일때 3가지 경우에 대해서 일단 연산해야함(그리디)
이 때, num[i]<b라면, 정답은 1이므로, 맨마지막 else문에 적어두고 위의 연산들만 신경쓰자.
3. 총감독관을 구하고, 남은 인원들에 대해 부감독관을 구한다.
num[i]>=b, num[i]==b일 때 b를 구하고, 그 식 안에 c에 대해 똑같이 경우를 나누어서 구하자.
주의 사항
1. 조건 속 "b,c에 대해 (b>=1,c>=1)", "C는 여러명이 있을 수 있다." 를 C도 최소 한명있어야 한다로 해석하면안됨.
즉,
인원 : 10
B: 10 , C: 10 일 때
B 1명, C 1명 이라고 해석하면 안됨. 테스트케이스 1번 결과를 참고해야한다.
2. if문안에각 연산이 끝나고 다른 식을 실행하지않게 적절히 if문을 사용해야함. 이것만 주의하면 끝끝끝
코드
#include<iostream> using namespace std; int num[1000001]; int main() { cin.tie(0); cin.sync_with_stdio(false); int n, b, c; //long long 해야함 long long ans = 0; cin >> n; for (int i = 1; i <= n; i++) cin >> num[i]; cin >> b >> c; for (int i = 1; i <= n; i++) { //num[i]가 b가관리할수있는인원보다많으면 if (num[i] >=b) { //ex)10 10이면 if (num[i] == b) { //c가 최소 1이므로 ans += 1; } //num[i]>b일 때 else { //일단 총감독관은 무조건++해주고, ans++; //남는 인원에 대해서 부감독관구함 num[i] -= b; //c에대해 연산 if (num[i] <= c) { ans++; } //num[i]>c else { //짝수처리 if (num[i] % c == 0) { ans += num[i] / c; } //홀수처리 else { ans += num[i] / c + 1; } } } } //num[i]<b일때 else { //총감독관한명만 배치하면됨. //주의!!: C도 한명추가되는게아님!! ans += 1; } } cout << ans << '\n'; }
결과
'문제풀이(BOJ) > 삼성 sw역량테스트 기출' 카테고리의 다른 글
[백준 17144] 미세먼지 안녕! (0) | 2020.01.29 |
---|---|
[백준 3190] 뱀 (0) | 2020.01.29 |
[백준 14503] 로봇 청소기 (0) | 2020.01.28 |
[백준 14501] 퇴사 (0) | 2020.01.27 |
[백준 14499] 주사위 굴리기 (0) | 2020.01.27 |