2022년 12월 25일에 작성됨
https://www.acmicpc.net/problem/25373
25373번: 벼락치기
부산사이버대학교에 다니는 대희는 강의 영상 보는 것을 매일 미뤘다. 오늘은 중간고사가 일주일 남은 날이다. 대희는 더 이상 미루면 큰일이 날 것 같아서 오늘부터 밀린 영상을 보기로 했다.
www.acmicpc.net
문제 분석
일주일 안에 n개의 영상을 모두 봐야 한다.
전날은 항상 다음날보다 영상을 적게 본다.
첫날 들어야 하는 영상 개수의 최솟값을 출력한다.
7+6+...+1 = 28을 기준으로 나눈다.
1. n이 28보다 작은 경우
n=1이면
1
n=2이면
2
n=3이면
2 1
n=4이면
3 1
n=5이면
3 2
n=6이면
3 2 1
n=7이면
4 3 또는 4 2 1
n=8이면
4 3 1
n=9이면
4 3 2
n=10이면
4 3 2 1
n=11이면
5 4 2
…
n=15이면
5 4 3 2 1
…
n=21이면
6 5 4 3 2 1
…
n=28이면
7 6 5 4 3 2 1
즉, 반복문으로 1부터 7까지 계속 더해주면서 크기를 비교해주는데
k+(k-1)+(k-2)+…+1 < n ≤ (k+1)+k+(k-1)+…+1 이라면 첫날 들어야 되는 영상 개수의 최솟값은 k+1이다.
예를 들어, n=8이면 3+2+1보다는 크고 4+3+2+1보다는 작다. 따라서 이때의 정답은 4가 된다.
2. n이 28보다 큰 경우
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)이
0~6 사이 → 8
7~13 사이 → 9
14~20 사이 → 10
…
(n-29)을 7로 나눈 몫이
0이면 → 8
1이면 → 9
2이면 → 10
…
따라서 (n-29)을 7로 나눈 몫 + 8을 해주면
n이 28보다 큰 경우에 첫날 들어야 하는 최소의 영상 개수를 구할 수 있다.
소스 코드 (⭕)
n = int(input())
if n <= 28:
for i in range(1, 8):
if n <= sum(range(1, i+1)):
print(i)
break
else:
print((n-29)//7+8)
코드 분석
1. n을 입력받고, if문으로 n을 28을 기준으로 범위를 나눠준다.
2. n이 28보다 작거나 같은 경우
1부터 8까지 누적합을 더하면서 n보다 크거나 같아지는 순간이 올 때의 i값 (=방금 더한 숫자 중의 가장 큰 값)을 출력한다.
3. n이 28보다 큰 경우
문제 분석에서 구한 공식 (n - 29) // 7 + 8을 그대로 출력해주면 된다.
end
크리스마스에 포스팅! 낭만적이다...ㅎ_ㅎ
'코딩테스트 & 문제 풀이' 카테고리의 다른 글
[Python]백준_13301 : 타일 장식물 (2) | 2023.11.09 |
---|---|
[Python]백준_17358 : 복불복으로 지구 멸망 (2) | 2023.11.09 |
[Python]백준_25643 : 문자열 탑 쌓기 (0) | 2023.11.07 |
[Python]백준_2057 : 팩토리얼 분해 (0) | 2023.11.06 |
[Python]백준_1431 : 시리얼 번호 (0) | 2023.11.05 |