코딩테스트 & 문제 풀이

[Python]백준_25373 : 벼락치기

Hicecream 2023. 11. 8. 00:37

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

크리스마스에 포스팅! 낭만적이다...ㅎ_ㅎ