<문제>
https://www.acmicpc.net/problem/25373
<생각하는 과정>
첫날 봐야 하는 영상 개수가 최솟값이어야 합니다. ( 인강을 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를 만들지 않아도 됩니다.