반응형
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이 전부 한 조각의 사이즈라는 것을 알고 다시 풀기 시작했다. 그리고 최대한 낮은 시간복잡도를 위해 수식과 조각의 조합이 최적화되는 순서를 통해 문제를 푸렁냈다.
반응형
'BOJ' 카테고리의 다른 글
[Python] 백준 11055: 가장 큰 증가하는 부분 수열 (0) | 2024.07.15 |
---|---|
[Python] 백준 1182: 부분수열의 합 (1) | 2024.07.05 |
[Python] 백준 17374: 비트베리 (0) | 2024.07.02 |