즐거운 PS 👩‍💻🥰

[백준-파이썬] 4454번: 상근이의 여자친구

dalin❤️ 2021. 10. 8. 10:29

백준 4454번

이분탐색법으로 풀었다.
풀이방법을 생각하는 것은 어렵지 않았는데, 헷갈리는 몇 가지가 있었다. 그래서 엄청 많이 틀리다가 겨우 맞았다..

🤔헷갈렸던 것들🤔

1. 초등학교 때 배웠던 거리, 속력, 시간의 관계 생각하기..^^

아래 나온 코드를 짤 때, 거 속 시를 활용했다.

    def useOil(speed):
        return (a * (speed ** 4) + b * (speed ** 3) + c * (speed ** 2) + d * speed) * (m / speed)

나중에는 아래와 같이 정리했다.

return ((a * (speed ** 3) + b * (speed ** 2) + c * (speed) + d) * m)

2. 소수점 고려하기!

이분탐색법 문제를 풀 때, mid=(left+right)//2, left=mid+1 이런 식으로 많이 풀었다. 그래서 처음에는 습관적으로(?) 그렇게 했는데 틀렸다. 생각해보니까 이 문제에서는 소수점 둘째자리까지 구해야 하는 것이었다. 그래서 아래와 같이 했다.

                le = mid
            else:
                ri = mid

3. 소수점 둘째자리까지 버림해서 출력하는 것!

가장 오래 헤맸던 부분..ㅠㅠ

print("{0:.2f}".format(mid))
print("%.2f" %mid)

처음에는 위와 같이 했다. 그런데 반올림 처리가 되어서,, 내가 원하던 것이 아니었다.

그래서 아래와 같이 복잡하게 처리했다.

        mid=str(round(mid,3))
        mid=float(mid[:-1])
        print("%.2f" %mid)

그런데 이렇게 해도 round로 반올림하기는 하는 거니까 정답에 영향을 준다.
그래서 일주일 정도 고민하고, 친구에게 도움을 받아서 아래와 같이 풀었다!!

        ans=int(ans*100)
        ans=ans/100
        print("%.2f" %ans)

4. 이분탐색의 범위를 정하는 것

전에 풀었던 문제들은 이분탐색의 시작점, 끝점이 딱 정해있었다. 그런데 이 문제는 끝점이 딱히 정해있지 않았다. 이것도 친구에게 물어봤다. 그럴 때는 10의 18승으로 잡고 하는 경우가 많다고 해서 그렇게 하다가, 나중에 10의 6승으로 바꿨다.

🥳완성한 코드🥳

while True:
    try:
        a, b, c, d, m, t = map(float, input().split())
        def useOil(speed):
            return ((a * (speed ** 3) + b * (speed ** 2) + c * (speed) + d) * m)

        ans=0
        le = 0
        ri = 10**6
        for _ in range(400):
            mid = (le + ri) / 2
            if (useOil(mid)<=t):
                ans = max(mid, ans)
                le = mid
            else:
                ri = mid

        ans=int(ans*100)
        ans=ans/100
        print("%.2f" %ans)

        #print("%.2f" %ans)
    except: break

🌸 문제 풀려고 하다가 찾은 것들..

🌺 반올림은 round를 활용하면 된다. round(대상, 몇째짜리까지 남겨둘건지)

answer=100.12345
print(round(answer,3)) #100.123
answer=100.12399
round(answer,3) #100.124

🌺 올림, 내림의 경우, math 모듈에 관련 함수가 있다.
ceil: 올림

import math
print(math.ceil(3.9)) #4
paint(math.ceil(-3.9)) #-3

floor: 내림

import math
print(math.floor(3.9)) #3
paint(math.floor(-3.9)) #-4

그런데 소수점 몇째자리에서 올림, 내림을 할 수는 없고 정수형으로 올림, 내림을 해준다.. 그래서 이 문제에서는 쓸 수 없었다.

728x90