Uknow's Lab.
article thumbnail

https://www.acmicpc.net/problem/25373

 

25373번: 벼락치기

부산사이버대학교에 다니는 대희는 강의 영상 보는 것을 매일 미뤘다. 오늘은 중간고사가 일주일 남은 날이다. 대희는 더 이상 미루면 큰일이 날 것 같아서 오늘부터 밀린 영상을 보기로 했다.

www.acmicpc.net

 

난이도 : 브론즈 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로 난이도 상승 의견을 제출했습니다

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.