반응형

백준 2851번 문제입니다.  (solved.ac)기준 브론즈 1 문제입니다.

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

 

2851번: 슈퍼 마리오

첫째 줄에 마리오가 받는 점수를 출력한다. 만약 100에 가까운 수가 2개라면 (예: 98, 102) 마리오는 큰 값을 선택한다.

www.acmicpc.net

간단한 구현 문제입니다. 10개의 버섯점수를 입력받고 순차적으로 먹으면서 점수의 합을 최대한 100에 가깝게 만드는 것이 목표입니다.

 

첫번째로 작성했던 코드입니다.

score = []
ans = 0
j = 0
for i in range(10) :
    score.append(int(input())) # 10번 반복하여 버섯의 점수를 입력

while True : # 무한하게 반복
    ans += score[j] # 점수를 획득

    if (ans == 100) : # 점수가 100과 동일하다면 즉시 반복문을 탈출하고 정답을 출력
        break
        
    elif (ans > 100) :
       	# ans가 100 보다 크다면 ans값과 ans값에서 방금 더해준 값(score[j])을 빼준 값 중
        # 100과 차이가 더 작은 값을 출력
        # 단 두 값의 차이가 같다면 둘 중 더 큰 값을 출력
        if ans - 100 <= 100 - (ans - score[j]) :
            break
        else :
            ans = ans - score[j]
        break

    j += 1

print(ans)

백준에서 채점했을 때 위의 코드는 100%에서 런타임에러(IndexError)가 발생했습니다. 생각을 해보니까 입력을 (1,1,1,1,1,1,1,1,1,1)과 같이 받는다면 10개의 버섯을 모두 먹어도 점수가 10점인데 위의 코드는 while True : 라는 무한 반복문에서

ans(점수 합이) 100을 넘었을 때에만 while 반복문을 탈출하도록 작성되어있어 인덱스 범위를 초과하여 계속해서 반복되는 문제가 발생합니다. 

 

두번째로 작성한 정답 코드입니다.

score = []
ans = 0
j = 0
for i in range(10) :
    score.append(int(input())) # 10번 반복하여 버섯의 점수를 입력

while j <= 9 : # j는 리스트의 인덱스를 나타냄
    ans += score[j] # 점수를 획득

    if (ans == 100) : # 점수가 100과 동일하다면 즉시 반복문을 탈출하고 정답을 출력
        break
        
    elif (ans > 100) :
        # ans가 100 보다 크다면 ans값와 ans값에서 방금 더해준 값(score[j])을 빼준 값 중
        # 100과 차이가 더 작은 값을 출력
        # 단 두 값의 차이가 같다면 둘 중 더 큰 값을 출력
        if ans - 100 <= 100 - (ans - score[j]) :
            break
        else :
            ans = ans - score[j]
        break

    j += 1

print(ans)

나머지는 동일하지만 while문의 조건을 j <= 9로 수정하여 10개의 버섯을 전부 먹으면 100점이 되지않아도 반복문을 탈출하고 정답을 출력할 수 있도록 수정하였습니다.

 

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기