코딩테스트

[Python, Java] 백준 3212번 - '피자' 풀이

CuckooBird 2023. 1. 23. 22:35

https://www.acmicpc.net/problem/3213

 

3213번: 피자

첫째 줄에 친구의 수 N이 주어진다. (1 ≤ N ≤ 10,000) 다음 N개 줄에는 각 친구가 먹을 수 있는 피자의 양이 주어진다. 이 값은 항상 분수이며, 1/4, 1/2, 3/4중 하나이다.

www.acmicpc.net


코드

Python

import sys
N = int(sys.stdin.readline().rstrip())
one_half = 0
one_quarter = 0
three_fourths = 0
for _ in range(N):
    input = sys.stdin.readline().rstrip()
    if input == '1/2':
        one_half += 1
    elif input == '1/4':
        one_quarter += 1
    elif input == '3/4':
        three_fourths += 1
answer = 0
answer += three_fourths
one_quarter -= three_fourths
answer += one_half // 2
one_half %= 2
if one_quarter > 0:
    if one_half == 1:
        one_quarter -= 2
        answer += 1
    if one_quarter > 0:
        one_quarter -= 1
        answer += one_quarter // 4 + 1
else:
    answer += one_half
print(answer)

answer에 더하는 순위는

1. 3/4 + 1/4 , 1/2 + 1/2

2. 1/2 + 1/4 , 1/2 + 1/4 + 1/4

3. 1/4 만 먹는 아이들

로 생각했습니다.

 

one_half : 1/2 먹는 아이들

one_quarter : 1/4 먹는 아이들

three_fourths : 3/4 먹는 아이들

 

그래서 three_fourths을 answer에 더하고, one_quarter에 three_fourths를 빼서 one_quarter에 저장합니다.

다음은 one_half를 처리합니다. one_half에 2를 나눈 몫을 answer에 저장 후, 나머지는 one_half에 다시 저장합니다. one_half가 홀수라면 1이고, 짝수라면 0이 들어갑니다.

 

one_quarter가 음수라면 남은 one_half를 answer에 그대로 더해주면 되겠지만,

one_quarter가 양수라면 one_half가 1일 경우, 나머지 1/2를 채워줄 one_quarter에 2를 빼줍니다. (여기서 one_quarter은 -1 이상의 수가 됩니다.)

이 경우에 한 판이 더 생기므로 answer에 1을 더해줍니다.

 

one_quarter 가 이 계산 후에 0혹은 -1이 된다면 피자는 한판 더 필요없으므로 그냥 나가야하지만,

0보다 큰 수라면 one_quarter // 4 + 1을 answer에 더해줍니다.

그런데 여기서 one_quarter가 4라면 answer에 1이 아닌 2가 들어가게 되므로, one_quarter 에 1을 빼줬습니다. 


Java

import java.util.Scanner;
public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		int N = scanner.nextInt();
		String input;
		int one_half = 0, one_quarter = 0, three_fourths = 0;
		for (int i = 0 ; i <= N ; i ++) {
			input = scanner.nextLine();
			if (input.equals("1/2")) {
				one_half ++;
			} else if (input.equals("1/4")) {
				one_quarter ++;
			} else if (input.equals("3/4")) {
				three_fourths ++;
			}
		}
		int answer = 0;
		answer += three_fourths;
		one_quarter -= three_fourths;
		answer += one_half / 2;
		one_half %= 2;
		if (one_quarter > 0) {
			if (one_half == 1) {
				one_quarter -= 2;
				answer ++;
			}
			if (one_quarter > 0) {
				one_quarter --;
				answer += one_quarter / 4 + 1;
			}
		} else {
			answer += one_half;
		}
		System.out.println(answer);
	}

}

후기

처음에는 리스트로 푸려고 해서 2차원 배열 정렬하는 방법을 찾아보다가 개수를 세면 더 간단해질 것 같아 방법을 바꿨습니다. 입력부분에서 three_fourths += 1을 해야할 것을 three_fourths = 1이라고 잘못써서 몇번이나 다시 돌려보고 찾았습니다.. ㅋㅋㅋ 덕분에 one_quarter > 0 if문 부분의 실수를 여러번 고친듯 하네요.