본문 바로가기

백준

5532 방학 숙제

먼저 문제 정리부터 했다.

 

 

정리하면서 어떻게 풀지 감이왔다. 그래서 바로 식으로 적어버렸다.

 

그런데 만약 페이지가 딱 떨어지지 않으면 하루를 더해야 하고 나누어 떨어지면 하루를 더하면 안된다. 여기서 조금 애매했다. 그냥 조건문으로 확인하면 쉽지 근데 더 간결하게 짜고 싶어서 고민이었다. 

 

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int l, a, b, c, d;
    scanf("%d %d %d %d %d", &l, &a, &b, &c, &d);
    
    printf("%d", l - max(a/c + max(a%c>0?1:0,0), b/d + max(b%d>0?1:0,0)));
    
    return 0;
}

 

결론은 이렇다

조건문으로 구구절절하게 하기 싫어서 삼항연산자로 때려 넣었다. 어느게 더 좋은 코드인지는 모르겠다. 왜냐면 이건 가독성이 떨어진다고 생각되기 때문,, <- 본인이 바로 알아보기 힘들다.

 

저 문장을 풀어보면 이렇다. 먼저 전체 방학에서 숙제하는 날을 빼야한다. 숙제한 날은 늦게 끝난 날을 기준으로 잡아야 하므로 국어, 수학 중 큰 값을 뺐다. 

 

a/c + max(a%c>0 ? 1 : 0, 0)

 

이 문장은 숙제 페이지가 나눠 떨어지지 않는 경우에 대한 문장이다. 만약 60페이지가 있는데 하루에 30페이지를 할 수 있으면 이건 2가 된다. 하지만 29페이지만 할 수 있다면 2일을 하고 마지막에 2p가 남아 하루를 더해야 한다. 그래서 먼저 max로 나머지가 있으면 1을, 없으면 0을 반환하게 한다. 삼항연산자는 페이지가 있으면 1을 없으면 0을 반환하게 하기 위해서 넣었다. 

아무튼 맞았습니다!!

 


올림을 이런 방법으로도 풀 수 있다! 쉽고! 간단하다! 그런데 처음에 이해하기는 어려워서 어떻게 돌아가는지 몰랐다. 

 

그래서 고민하다가 이렇게 되는구나 이해했음

이건 그냥 값 넣어보다 그렇구나 했고 부등식으로 증명할 수 있다.

범위를 구해보면 (a + b - 1) / b는 k+1 이상 k+2미만이다. 그래서 몫을 구하면 (몫 구하는건 내림과 같다) k+1이 나온다. 

 

 

#include <iostream>
#include <algorithm>

using namespace std;

int main() {
    int l, a, b, c, d;
    scanf("%d %d %d %d %d", &l, &a, &b, &c, &d);
    
    printf("%d", l - max((a + c - 1)/c, (b + d - 1)/d));
    
    return 0;
}

 

땀 뻘뻘 흘리며 쓴 삼중연산자는 이렇게 간단하게 바뀌었답니다.

다음에도 써먹어야겠다. 

 

'백준' 카테고리의 다른 글

2355 시그마  (0) 2019.10.01
10707 수도요금  (0) 2019.10.01
10162 전자레인지  (0) 2019.09.30
2480 주사위 세 개  (0) 2019.09.30
2530 인공지능 시계  (0) 2019.09.30