문제
오늘은 상근이의 생일이다. 상근이는 친구들과 피자를 먹으러 갔다.
상근이의 친구들은 매우 어려서 피자 한 판을 먹을 수 없다. 하지만, 각 친구들은 자신이 먹을 수 있는 피자의 양을 알고 있다.
친구들이 먹을 수 있는 피자의 양은 항상 1/4, 1/2, 3/4 중 하나이다.
상근이는 피자 최소 몇 판을 시키면 친구들이 모두 피자를 자신이 먹을 수 있는 양만큼 먹을 수 있는지 구하는 프로그램을 작성하시오. 상근이는 피자를 먹지 않으며, 모든 친구들이 정확히 한 조각씩 피자를 가져야 한다.
입력
첫째 줄에 친구의 수 N이 주어진다. (1 ≤ N ≤ 10,000)
다음 N개 줄에는 각 친구가 먹을 수 있는 피자의 양이 주어진다. 이 값은 항상 분수이며, 1/4, 1/2, 3/4중 하나이다.
출력
피자를 최소 몇 판 시키면 모든 친구들이 자신이 먹을 수 있는 양만큼 먹는지 출력한다.
예제 입력 1
3
1/2
3/4
3/4
예제 출력 1
3
예제 입력 2
5
1/2
1/4
3/4
1/4
1/2
예제 출력 2
3
예제 입력 3
6
3/4
1/2
3/4
1/2
1/4
1/2
예제 출력 3
4
<Code>
//3213] 피자
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
freopen("input.txt","rt", stdin);
int n, res=0, h=0, q1=0, q3=0;
string s;
cin>>n;
for(int i=0; i<n; i++){
cin>>s;
if(s=="1/4") q1++;
else if(s=="1/2") h++;
else if(s=="3/4") q3++;
}
//1/4와 3/4를 서로 짝지어서 피자 한판
while(q1>0 && q3>0){
q1--;
q3--;
res++;
}
//3/4조각은 다른 조각과 합칠 수 없으므로 res++;
while(q3>=1){
q3--;
res++;
}
//1/2 계산
res+=h/2;
h-=(h/2*2);
//1/2조각과 1/4조각이 남았을 경우 피자 한판
while(h>=1 && q1>=2){
h--;
q1-=2;
res++;
}
//남은 1/4조각이 4개이상이라면 피자 한판
while(q1>=4){
q1-=4;
res++;
}
//2/1조각과 1/4조각으로 한판이 만들어진다면
while(h>0){
if(q1>=2){
h--;
q1-=2;
res++;
}else{
break;
}
}
//그래도 남는 조각이 있다면
if(h>0 || q1>0) res++;
cout<<res;
return 0;
}
<Comment>
- "모든 친구들이 정확히 한 조각씩 피자를 가져야 한다."라는 문구를 이해를 잘 못했었다. 보니 전에는 오역으로 이부분이 빠져있어서 문제 푸는데 어려움이 있었던것 같은데 있어도 똑같ㅇㅏㅆ,,, 예제1의 출력이 2가 아닌 3인 이유다.
- 일단 1/4, 1/2, 3/4 조각을 각각 count해서 변수에 다 저장한 다음, 피자 한판이 만들어지는 모든 경우의 수를 일일히 하나하나 생각해내서 풀었다. 여러번 해보다가 대여섯번 시도해도 자꾸 어딘가에서 틀렸는데 내 최애 샤브샤브먹고와서 20분만에 맞음.
https://www.acmicpc.net/problem/3213
3213번: 피자
첫째 줄에 친구의 수 N이 주어진다. (1 ≤ N ≤ 10,000) 다음 N개 줄에는 각 친구가 먹을 수 있는 피자의 양이 주어진다. 이 값은 항상 분수이며, 1/4, 1/2, 3/4중 하나이다.
www.acmicpc.net
'Problem Solving > 백준' 카테고리의 다른 글
[백준-7785] 회사에 있는 사람 (0) | 2021.09.25 |
---|---|
[백준-1463] 1로 만들기 (0) | 2021.09.19 |
[백준-4779] 칸토어 집합 (0) | 2021.09.16 |
[백준-20206] 푸앙이가 길을 건너간 이유 (0) | 2021.09.12 |
[백준-22973] 점프 숨바꼭질 (0) | 2021.09.08 |