https://www.acmicpc.net/problem/25373
난이도 : 브론즈 2
태그 : 수학, 많은 조건 분기
설명
본 문제의 테스트 케이스는 크게 두가지로 나눌 수 있습니다.
1. n <= 28
2. n > 28
7+6+5+4+3+2+1 = 28 보다 크냐 아니냐 입니다.
28이하 작을 때에는 피연산자를 하나씩 늘이면서 1 ~ 7개의 피연산자를 둘 수 있지만,
28보다 클 경우엔 피연산자가 7개로 고정이기 때문입니다.
n <= 28
봐야하는 영상 개수가 1개 일때는 첫날의 시청해야 할 영상의 개수는 1개.
2개 1 + 1
3개 2 + 1
4개 3 + 1
5개 3 + 2
6개 3 + 2 + 1
.
.
.
28개 7 + 6 + 5 + 4 + 3 + 2 + 1
1 -> 1
2~3 -> 2
4~6 -> 3
7~10 -> 4
11~15 -> 5
16~21 -> 6
21~28 -> 7 로 나타낼 수 있습니다.
태그에 '많은 조건 분기'가 있는 걸로 보아,
if 혹은 switch 문으로 각각의 케이스를 하나씩 처리해줘도 되겠지만,
어느정도 규칙성이 보여 반복문으로 처리할 수 있을 것 같네요.
if n <= 28:
for i in range(1, 8):
if n <= sum(range(1, i + 1)):
print(i)
n이 7이라 가정했을 때,
3+2+1 보다는 크고, 4+3+2+1 보다는 작으니 n이 7일때 값은 4 입니다.
반복문을 돌리며 값을 찾아나가면 되겠죠?
n > 28
7+6+5+4+3+2+1 = 28보다 큰 경우입니다.
28 이하일땐 더하는 피연산자가 1~7개였지만,
28 보다 클 때는 피연산자가 7개로 고정입니다.
또, 총 7개의 숫자가 1씩 증가하면 7이므로,
n이 29 (8+6+5+4+3+2+1) ~ 35 (8+7+6+5+4+3+2) 사이라면 -> 8
36 (9+7+6+5+4+3+2) ~ 42 (9+8+7+6+5+4+3) -> 9
43 (10+8+7+6+5+4+3) ~ 49 (10+9+8+7+6+5+4) -> 10
당연하게도 7을 주기로 봐야하는 영상의 개수가 1씩 증가합니다.
이를 일반화하면
(n - 29) // 7 + 8
으로 나타낼 수 있습니다.
소스코드
n = int(input())
if n <= 28:
for i in range(1, 8):
if n <= sum(range(1, i + 1)):
print(i)
exit(0)
else:
print((n - 29) // 7 + 8)
(n - 29) / 7 의 몫만 구하고 소숫점 부분은 버리기 위해,
int((n-29) / 7) 로 정수형으로 변환시켰는데, 부동소숫점 오류인지 계속 틀렸습니다를 받더라고요.
파이썬에서 몫을 구하는 아주 간단한 방법인 // 연산자가 있는걸 깨닫고,
int(n) 대신 // 를 사용했더니 무사히 통과했습니다.
후기
브론즈2 답지 않게 조금 매콤한 맛에 당황했던 문제였네요
문제 해결 아이디어를 떠올리기 전까지 시간이 좀 들었던 것 같습니다.
아이디어를 떠올리고도 부동소숫점 오류를 간과하지 못해 좀 헤맸고요.
소심한 복수로 브론즈1로 난이도 상승 의견을 제출했습니다
'코딩테스트 > Python' 카테고리의 다른 글
[백준 23253번] [Python] 자료구조는 정말 최고야 (0) | 2022.11.18 |
---|---|
[백준 25643번] [Python] 문자열 탑 쌓기 (0) | 2022.11.18 |
[백준 5566번] [Python] 주사위 게임 (0) | 2022.11.11 |
[백준 5211번] [Python] 가단조와 다장조 (0) | 2022.11.11 |
[백준 5426번] [Python] 비밀 편지 (1) | 2022.11.11 |