[C언어] 백준 1712 : 손익분기점

mainsain·2022년 3월 13일
0

백준

목록 보기
2/64

처음에 내가 푼 코드

#include <stdio.h>

int main()
{
    int flag;
    long long fix, count, pay, sum, set;
    // long으로 안하면 21억 1억 1억1을 입력을 했을 때 오버플로우가 일어난다. 
    // 그래서 longlong으로 때려박았음
    
    scanf("%lld %lld %lld", &fix, &count, &pay); // abc 입력
    if (count >= pay)
    {
        printf("-1");
    } // b가 c보다 크거나 같을경우, 손익분기점이 절대 안넘기에 -1로 처리
    else
    {
        flag = 1; // while문이 돌면서 flag하나씩 증가시켜 손익분기점이 어디부터인지 체크하기 위함
        set = 1;
        sum = fix;
        while (1)
        {
            sum = sum + count; // 하나씩 증가시키면서 sum에 적립시킴
            set = pay * i; // 이것도 적립
            if (sum < set) // 만약 손익분기점을 넘었다?
            {
                printf("%d", flag); // flag 출력 후 break로 반복문 종료.
                break;
            }
            flag++;
        }
    }
}

이렇게 제출하면 시간초과가 난다.

최악의 경우 while문을 엄청나게 돌리면서 0.35초가 넘어가기 때문이다. 뭐 21억, 1억, 1억1 이렇게만 입력해줘도 1억번이 돌아간다..

검색을 통해 a / (c - b) 로 손익분기점을 체크할 수 있는걸 알았다.

수정한 코드

#include <stdio.h>

int main()
{
    int flag;
    int fix, count, pay;

    scanf("%d %d %d", &fix, &count, &pay);
    if (count >= pay)
    {
        printf("-1");
    }
    else
    {
        flag = 1;
        while (1)
        {
            if (fix / (pay - count) < flag)
            {
                printf("%d", flag);
                break;
            }
            else
                flag++;
        }
    }
}

flag는 그대로 유지했고, while문도 같다. 단지 a / (c - b)로 필요없는 덧셈식을 제거했고, 정답이 되었다.

다른사람 코드

#include <stdio.h>
int main(){
    int a,b,c;
    scanf("%d %d %d",&a,&b,&c);
    
    if(b>=c) printf("-1\n");
    else printf("%d\n",a/(c-b)+1);
    return 0;
}

근데 다른사람 코드보니 else에 그냥 + 1하고 그대로 출력을 하였다.
걍 어이가 없었다 보고 나니 깨닫게 됨
아 당연하구나..

그리고 굳이 fix count pay 이딴식으로 지었어야 했을까
그냥 abc할 걸 그랬나 싶기도 한데
음..
아니다 변수명 짓는건 그대로 이어나가자 지금부터 연습해놔야지

profile
새로운 자극을 주세요.

0개의 댓글