Problem Solving/백준

[백준-3214] 피자

문제

오늘은 상근이의 생일이다. 상근이는 친구들과 피자를 먹으러 갔다.

상근이의 친구들은 매우 어려서 피자 한 판을 먹을 수 없다. 하지만, 각 친구들은 자신이 먹을 수 있는 피자의 양을 알고 있다.

친구들이 먹을 수 있는 피자의 양은 항상 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