티스토리 뷰

그냥 주어진대로 반복문을 활용해 풀면 시간초과가 발생하는 문제.

수식을 세워야 함.

 

(day - night)*x > height로 구하면 안된다. 

이 조건을 위배하기 때문.

낮중에 이미 정상에 올라갔는데 그날 밤에 내려가는 걸 계산했을 시, 높이 미달성인 경우를 고려하지 않은 수식이다.

 

즉, 위 수식은 '밤 기준'으로 세워진 수식이기 때문에, 높이를 갱신하게 되는 '낮 기준'의 수식을 세워야 한다.

 

day x일의 높이는 어떻게 구할까?

x일만큼 낮에 올라간 거리에서 (x-1)일만큼 밤에 내려간 거리를 빼면 된다.

x*day - (x-1)*night > height 를 달성하는 최소 정수값 x를 구하면 끝이다.

식을 잘 정리하면 x > (distance - night) / (day - night) 이다.

항상 이런 나누기 부등호 문제는 두가지를 고려해야한다.

 

1. 분모가 0일 경우 -> 예외조건 처리

2. 분모가 음수일 경우 -> 부등호 반대로 변경

 

그러나 이 문제에서 항상 낮 이동거리>밤 떨어지는 거리라고 값 범위 지정이 되어있기 때문에 1,2번의 문제 모두 발생하지 않는다.

 

    int day, night,distance, date;
    cin >> day >> night >> distance;
    date = (distance - night) / (day - night);    
    cout << date;

그러나 이렇게 내면 안된다. 반례로 5 1 6이 2가 아니라 1을 출력한다.

그 이유는... int값인 date에 분수가 들어갈 경우, 무조건 내림처리를 하기 때문이다.

5 1 6의 경우 x > 5/4(== 1.25) 의 수식으로, x = 1이 되어버리기 때문임.

double로 받아서 처리하는 경우가 있겠지만 좋은 처리법이 아니라고 생각하여 직접 검사문을 하나 넣었다.

    if((distance - night) % (day - night) != 0) {
        date++;
    }

나머지가 0이 아닐경우(분수일 경우) 내림처리가 되어버린 date에 직접 1을 더해준다.

 

'■ 알고리즘 > ◻ 백준' 카테고리의 다른 글

[C++]2775번: 부녀회장이 될테야  (0) 2022.10.25
[C++]2566번: 최댓값  (0) 2022.10.25
[C++] 1193번: 분수찾기  (0) 2022.10.23
[Python]10799번: 쇠막대기  (0) 2022.08.12
[Nodejs]17413번: 단어 뒤집기 2  (0) 2022.08.03
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/11   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30
글 보관함