본문 바로가기
BOJ

[Python] 백준 3213: 피자

by 야호호코코 2024. 7. 12.
반응형

 

solved.ac기준 Silver 4

 

문제 자체의 난이도는 낮은데 비문학 같이 해석에 애를 먹어 시간이 오래걸리거나 제출 난사를 해서 풀게 되면 멘탈이 붕괴되는 것 같다. 이 문제가 그런 케이스였다.

문제

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

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

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

 

정답 코드

N = int(input())
friend = [list(map(int, input().split('/'))) for _ in range(N)]
friend_split = [0, 0, 0]

for f in friend:
    if f[1] == 2:
        friend_split[0] += 1
    elif f[0] == 1:
        friend_split[1] += 1
    else:
        friend_split[2] += 1

result = 0

# 3/4와 1/4를 최대한
result += friend_split[2]
friend_split[1] -= friend_split[2]

# 1/2와 1/4를 최대한
if friend_split[1] > 0 and friend_split[0] > 0:
    tmp = friend_split[1] // 2 if friend_split[1] // 2 < friend_split[0] else friend_split[0]

    result += tmp
    friend_split[0] -= tmp
    friend_split[1] -= tmp * 2
    if friend_split[1] > 0:
        result += friend_split[1]
        friend_split[0] -= friend_split[1]
        friend_split[1] = 0

# 1/2 끼리
if friend_split[0] > 0:
    result += friend_split[0] // 2
    result += friend_split[0] % 2

# 1/4 끼리
if friend_split[1] > 0:
    result += friend_split[1] // 4
    result += 1 if friend_split[1] % 4 else 0

print(result)

 

 처음에 문제를 보았을 땐 피자를 전부 4등분 시켜서 시도했지만, 뒤늦게 1/2, 1/4, 3/4이 전부 한 조각의 사이즈라는 것을 알고 다시 풀기 시작했다. 그리고 최대한 낮은 시간복잡도를 위해 수식과 조각의 조합이 최적화되는 순서를 통해 문제를 푸렁냈다.

반응형