[Python, Java] 백준 3212번 - '피자' 풀이
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문 부분의 실수를 여러번 고친듯 하네요.