ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 > Python3 > 2909번 : 캔디 구매
    알고리즘/쉬운 문제 2020. 3. 29. 08:41

    휴~ 정말 오랜만에 포스팅을 하게됬네요.

    학생 신분으로 이것저것 하고 있고 개인적으로 작업이 들어와서 작업을 했는데.

    견적 내는게 보통일이 아니네요. 쉬울줄 알고 막상 시작했는데 하면할수록 저너머 우주로....;;

     

    아무튼 오늘은 ! 캔디구매라는 문제를 풀어보겠습니다.

     

    이 문제의 경우는 굉장히 간단한 문제이죠?? 반올림 문제!!

    그냥 문제를 보셔도 아실거에요. 하지만 파이썬으로 푸신다면 조금 고생하실 수도 있어요.

     

    반올림에는 여러가지가 있지만 파이썬에서는 우리가 일상적으로 사용하는

    human arithmetic방식이 아닌 binary arithmetic 방식을 사용해요.

    정확히는 round to the nearest: tiest to even인데요!!

    일반적으로 4사5입으로 4는 버리고 5는 올려주는 방식이죠.

    그른데! 이 파이썬의 반올림 함수인 round의 경우에는 

    반올림을 하는자리의 앞자리가 홀수이면 5를 올림해주고 짝수이면 버림을 하는 방식이에요.

     

    이걸 모르면 굉장히 고생합니다ㅠ

    반올림 방식에는 여러가지가 있고 부동소수점과 연관해서도

    많은 이슈가 있죠. 저희가 해야하는건 복잡한 연산이 아니라 일반적인 연산과

    조금 복잡한 알고리즘이에요. 그렇기에 디테일하게 다룰 필요없이!!

    어떻게 결과가 나온다만 안다면 얼마든지 그에 대응해서 결과값을 낼 수가 있어요.

     

    저는 대회때 이부분을 간과해서 정말 쉬운문제라서

    다른 사람들은 5분이면 다 푸는 문제를 2시간 가까이 못풀었던 적이 있네요.

     

    아무튼 일단 문제를 먼저 보도록할게요!

     

    문제

    오늘은 화이트데이이다.

    상근이는 여자친구를 위해서 사탕을 사려고 한다.

    하지만, 상근이는 독특한 성격을 가지고 있어서,

    특정 액면가의 지폐만 가지고 있는다.

    또, 거스름돈은 받지 않는다.

    따라서, 사탕 가게의 사장과 상근이는 다음과 같은 합의를 했다.

    상근이는 사장에게 자신이 가지고 있는 지폐의 액면가를 말해준다.

    그럼 사장은 상근이가 지불할 수 있는

    가장 가까운 금액으로 사탕의 가격을 반올림해준다.

    예를 들어, 상근이가 가지고 있는 지폐의 액면가가 100원이라고 하자.

    만약 상근이가 고른 사탕의 가격이 150원이라면,

    사장은 가격을 200원으로 반올림해서

    상근이가 낼 수 있도록 해준다.

    또, 가격이 149원이라면, 사장은 가격을 100원으로 반올림해서

    상근이가 지불할 수 있도록 해준다.

    상근이가 가지고 있는 지폐의 액면가는

    항상 1, 10, 100, 1000, ..., 1,000,000,000 중 하나이다.

    또, 지폐를 무한개 가지고 있다.

    사탕 가격과 상근이가 가지고 있는 지폐의 액면가가 주어졌을 때,

    사장은 가격을 얼마로 바꿔줄 것인지 구하는 프로그램을 작성하시오.

    입력

    첫째 줄에 사탕의 가격 C와 상근이가 가지고 있는

    지폐의 액면가에 적혀있는 0의 개수 K가 주어진다.

    (0 ≤ C ≤ 1,000,000,000, 0 ≤ K ≤ 9)

    출력

    첫째 줄에 상근이가 내야하는 가격을 출력한다.

     

    예제 입력 예제 출력

    184 1

    50 2

    180

    100

    풀이

    c,k=map(int,input().split())
    print(int(round(c+0.1,-k)))

    굉장히 간단하죠??

    이런 제가 자주 사용하는 방법은 근본적으로

    반올림의 방식을 바꿔주는 방법은 아니에요.

    반올림하는 함수를 따로 구해주셔도 되지만

    저는 보통은 그렇게 하지 않고 값을 조금씩 바꿔서

    결과만 맞게 만들어주는 방법을 사용해요!

     

    반올림을 하는 위치의 바로 아래쪽이나

    혹은 더 아래쪽의 값을 1만큼 올려주어서 반올림을 적용시켜요.

    이렇게 되면 더 이상 절반값이 아니게 되죠!!!

     

    예를들어서 1500이라는 값을 백자리에서 반올림을 한다고하면

    500은 1000의 절반이에요. 그래서 이 값을 반올림을 하려고하면

    500의 앞자리가 1이므로 결과값은 1000이 되겠죠??

     

    하지만 1510이나 1501의 경우에는 더 이상 절반이 아니므로!!!

    2000이 됩니다!!

     

    하지만 여기서 굉장히 주의해주셔야할 부분이 있는데요.

    바로 앞자리가 짝수이고 반올림하려는 자리가 4이고 뒷부분이 9로 채워진 경우에요!!

    2499의 경우에는 일반적으로 반올림을하면 2000이 되어야겠지만!!

    제가 사용하는 방식으로 하게되면 2500으로 맞춰기게되어서 3000이 나오게 되죠.

     

    그래서 조금 타이트한 문제의 경우에는 최대한 자릿수를 낫춰주는게 좋아요.

    소수점 아래 10자리의 위치에서 1을 더해준다는 식으로요!

    보통은 하나나 두세자리의 값을 변경시키는데 틀리는 경우에는

    10자리 100자리로 내려가고 그것도 안된다??

    그러면 어쩔 수 없이 반올림하는 함수를 다시 구해줘야겠죠???

     

    하지만 함정은 알고리즘 문제는 파이썬만 사용하는게 아니니.

    형평성을 위해서는 그런 문제는 나오지 않을 것 같아요.

    파이썬 사용하는 것들은 쉬운언어를 사용하니까.

    고생 좀 해봐랏! 반올림 함수 구현해서 문제풀어!!!라는건 없겠죠?? 제발 ㅎㅎ

     

    아무튼! 오랫만에 포스팅을 했네요.

    다들 열심히 공부해서 또 공부합시다~~~^^:)!@$!@#!$

Designed by Tistory.