본문 바로가기

Coding Tests/백준 온라인

(Python) 백준 25373번

<문제>

 

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

 

25373번: 벼락치기

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

www.acmicpc.net

 

<생각하는 과정>

 

첫날 봐야 하는 영상 개수가 최솟값이어야 합니다. ( 인강을 7개 들어야 한다면 첫째 날에 그냥 벼락치기 방법은 안된다는 것이죠... )

 

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

N = 8이면 4 3 1

N = 9이면 4 3 2

N = 10이면 4 3 2 1

N = 11이면 5 3 2 1

N = 12이면 5 4 2 1

N = 13이면 5 4 3 1

N = 14이면 5 4 3 2

N = 15이면 5 4 3 2 1

N = 16이면 6 4 3 2 1

N = 17이면 6 5 3 2 1

N = 18이면 6 5 4 2 1

N = 19이면 6 5 4 3 1

N = 20 이면6 5 4 3 2

N = 21이면 6 5 4 3 2 1

N = 28이면 7 6 5 4 3 2 1

N = 36이면 8 7 6 5 4 3 2 1

 

방법 1 : 첫째날첫째 날 인강을 6개를 듣는 경우는 6개, 7이면 7가지의 경우가 있습니다. 그렇다면 첫째 날 인강을 8개 듣는다면 8일 때의 경우의 수가 8개가 됩니다. 그렇지만 뭔가.. 이상합니다. 바로 중간고사가 일주일이 남았다는 사실을 간과한 것입니다..  이와 같은 이유로 방법 1의 가정은 틀렸다는 것을 깨달을 수 있었습니다. ( 첫째 날 인강 8개 들으면 8일 동안 듣고, 첫째 날 인강을 9개 들으면 9일간 듣는 가정은 틀렸다는 것입니다. )

 

그렇기에 위의 방법1을 바탕으로 작성한 아래의 코드를 제출하는 것은 옳지 않습니다.

 

N = int(input())

sum = 0
n = 1
while sum <N:
    sum +=n
    n+=1
print(n-1)

 

 

방법 2: 디폴트로 7 6 5 4 3 2 1로 잡고, 주어지는 수 N을 7로 나눈 후 몫을 나눠 a [0]부터 a [6]까지 더하고 나머지를 앞에서부터 균등하게 나눠 더한다면? 괜찮을 것 같다는 생각을 하게 되었습니다. 어차피 7일이라는 틀이 정해져 있고, 28보다 큰 수더라도 문제의 조건에 맞게 분배해준다면 정답을 맞힐 수 있겠다는 생각을 하였고 아래의 코드를 작성하였습니다.

  

N = 28 이하의 수는 위의 방법 1 코드를 이용해 계산해줄것입니다. ( N = 28이면 7 6 5 4 3 2 1이고, 방법 1 코드도 28까지는 문제의 조건에 맞는 값을 도출할 수 있습니다. )

 

<오답 코드 입니다>

N = int(input())
sum = 0
a = [7,6,5,4,3,2,1]
n = 1
if N <= 28:
    while sum < N:
        sum += n
        n +=1
    print(n-1)
else:
    mox = N//7
    rem = N%7
    if rem >0:
        a[0]+=mox+1
    else:
        a[0]+=mox
    print(a[0])

 

N = 29부터 else구문의 코드에서 동작하게 끔 구현을 해주었는데요. 출력결과가 생각했던 결과가 아니였습니다. 그 이유는

mox = N //7 부분의 오점 때문입니다. N = 29라고 하면 mox의 값이 4가 되는데요. 그럼 생각과는 다른 a [0]의 값을 구하게 됩니다. 이미 N = 28의 경우의 수가 리스트 a에 담겨있기에 N에서 28을 뺀 후 7로 나눠 몫을 구해줍니다.

 

<정답 코드>

 

N = int(input())
sum = 0
a = [7,6,5,4,3,2,1]
n = 1
if N <= 28:
    while sum < N:
        sum += n
        n +=1
    print(n-1)
else:
    quotient = (N-28)//7
    rem = N%7
    if rem >0:
        a[0]+= quotient+1
    else:
        a[0]+= quotient
    print(a[0])

 

꼭 리스트 a를 만들지 않아도 됩니다.