본문 바로가기

알고리즘

백준 2839 설탕 배달 [지극히 개인적인 풀이 과정] 실패의 연속

상근이의 귀찮음을 풀어주기 위해 문제를 풀어본다.

 

5kg만으로 가능한 경우,  > 5로 나눴을 때 딱 나누어 떨어진다.(나머지가 0이다) > input값을 5로 나눠준다.

 

5kg으로 안되면 5kg과 3kg을 섞는 경우 > 5로 나눴을 때 나머지가 3이다.(input을 5로 나누고, 1을 더한다)  혹은 10으로 나눴을 때 나머지가 6 또는 9이다. 

 

3kg만 쓰는 경우 > 3으로 나눴을 때 딱 나누어 떨어진다.(나머지가 0이다)  

 

위의 경우에 해당 안되는 경우 Nkg만큼 배달이 불가능 할 경우 -1을 출력한다.(장사 접자!)

 

라고 생각을 하고 우선 문제에 접근했다.

 

해서 나온 코드가 아래와 같다.

order = int(input())
if order % 5 == 0:
    print(int(order / 5))
elif order % 5 == 3:
    print(int(order / 5 + 1))
elif order % 10 == 6:
    print(int((order / 10)*2 + 2), 'a') 
elif order % 10 == 9:
    print(int((order / 10)*2 + 3), 'b')
elif order % 3 == 0:
    print(int(order / 3))
else:
    print(-1)

제출 결과 나오는 빨간색 "틀렸습니다"

 

뭐가 잘못 됐을 지 생각해본다. 19를 넣으면 10으로 나눈 값 1*2에  3kg이 3개 들어가야하므로 3을 더한

5kg 2개, 3kg 3개 해서 총 5가 출력되어야 하는데 6이 출력된다.

이상해서 39를 넣어봤다. 5kg 6개, 3kg 3개로 이번엔 9가 출력되야 되는데 10이 출력된다... 뭔가 하나가 더 출력된다.

원래 출력되어야 할 값보다 1이 더 높게 출력되는상황..

뭔가 이상해서 'a'로 출력되는 부분도 임의의 값을 넣어보니 원래 생각한 것 보다 1이 높게 나왔다.

이상해서 테스트용 print를 또 뽑아봤다. 보면 볼수록 이해가 안갔는데 유심히 본 결과 실수를 찾았다...

테스트용에서는 int(order/10)으로 10을 나눈 값에 씌워줬는데 실제로 출력하는 값 'a'와 'b'쪽 구간에는

int를 나눈 값에 바로 씌워준게 아니라 바깥 부분에 씌워줘서 (order/10)이 1.9가 되는 것이 문제였다...

이것을 해결하고 값을 넣으니 원하던 대로 작동한다!

하지만 이번에도 제출 결과는 틀렸다고 나왔다... 모든 경우를 고려했다고 생각했는데 아닌가보다.

내가 한 방식대로면 11을 넣었을 때 -1이 나온다. 21을 넣었을 때도 5가 나와야되는데 7이 나온다.

 

여러가지 넣고 반례에 해당하는 조건을 추가하고 하다가 다 실패했다...

무식하면 용감하다고 생각나는 경우의 수를 다 써봤는데 예외가 항상 있었다. 다른 방식을 고민해 봐야할 때라고 생각한다.

 

내일 다시 풀어보기로 한다.