[PS] 백준 1049번: 기타줄

|

문제

쉬운 문제이지만 방심해서 틀렸습니다를 받았다. 이런 계산문제는 주의해야 할게 여러가지 케이스가 존재한다는 점이며 그 케이스를 모두 점검해 봐야 한다. 나는 결론적으로 아래와 같이 나누었다.

  • 기타줄 6개 미만
    • 패키지 > 낱개: 낱개로 사기
    • 패키지 <= 낱개: 패키지로 사기
  • 기타줄 6개 이상
    • 패키지 > 낱개*6: 낱개로 사기
    • 패키지 <= 낱개*6: 패키지로 사기

로직은 동일하지만 기타줄이 6개 미만일 때를 조심해야 한다. 무작정 6개를 사는 것이 아니기 때문이다.

#include <cstdio>
#include <algorithm>
using namespace std;

int n,m,pm,sm,pa,sa,ans;

int main(void)
{
    scanf("%d%d",&n,&m);
    pa = sa = 2100000000;
    while(m--){
        scanf("%d%d",&pm,&sm);
        pa = min(pa,pm);
        sa = min(sa,sm);
    }

    while(n) {
        if(n<6) {
            ans += pa<sa*n ? pa : sa*n;
            n=0;
        }
        else {
            if(pa<sa*6) ans += (n/6)*pa;
            else ans += (n/6)*sa*6;
            n%=6;
        }
    }
    printf("%d",ans);
    return 0;
}