[BOJ] 수학 1(1)

2020. 7. 24. 01:04BOJ

슬슬 조금이나마 어려워지고 있습니다.

 

[BOJ 1712]

 

몸풀기 잘했습니다. 고정비용을 판매당 순이익으로 나눠주면 됩니다. 무조건 총순이익이 (+)가 돼야 하기 때문에 +1을 해줍니다.

#include <stdio.h>

int breakevenpoint(int fixcost, int varcost, int pergain){
    if(varcost >= pergain)
        return -1;
    else{
        int perincome = pergain - varcost;
        return (fixcost / perincome) + 1;
    }
}

int main(){
    int A, B, C;
    scanf("%d%d%d",&A,&B,&C);
    printf("%d",breakevenpoint(A,B,C));
}

 

[BOJ 2839]

 

일단 최대한 5킬로짜리로 채워봅니다. 안 맞을 때마다 5킬로 하나씩을 다시 풀어서 3킬로짜리로 맞춰지는지 봅니다. 5킬로짜리를 3개 풀면 어차피 그 차이가 3의 배수라 의미가 없습니다. 3번 해보고 안되면 끊어줍니다.

#include <stdio.h>

int divweight(int weight){
    const int option1 = 5, option2 = 3;
    int rem = weight % option1;
    for(int k=0;k<option2;++k){
        if(rem % option2 == 0) break;
        rem += option1;
        if(rem > weight) return -1;
    }
    if(rem % option2 != 0) return -1;
    else return (weight - rem) / option1 + rem / option2;
}

int main(){
    int W;
    scanf("%d",&W);
    printf("%d",divweight(W));
}

 

[BOJ 2292]

 

시작하는 지점은 1번으로 1번 만에 갈 수 있는 곳은 1번만 있습니다. 그다음 2번 만에 갈 수 있는 곳 6개 추가, 그다음 12개 추가하는 식으로 해서 세주면 됩니다. 

#include <stdio.h>

int minpathroom(int roomno){
    int coverage = 1;
    int roomcount = 1;
    for(int stepno = 1;roomno > coverage;stepno++){
        coverage += stepno * 6;
        roomcount++;
    }
    return roomcount;
}

int main(){
    int R;
    scanf("%d",&R);
    printf("%d",minpathroom(R));
}

 

[BOJ 1193]

 

포장은 분수지만 결국에는 (X, Y) 순서쌍으로 다루어주면 됩니다. 먼저 X+Y인 순서쌍들끼리 묶어서 그룹으로 보고 몇 번째 그룹인지 찾아준 후에 그룹 안에서 몇 번째인지 보면 됩니다. 지그재그로 세어주므로 홀수(혹은 구현에 따라 짝수)인 경우에는 뒤집어주면 됩니다. 

#include <stdio.h>
#include <utility>

typedef std::pair<int,int> div_t;

div_t div(int n){
    int lastsum, sum = 0, groupno = 1;
    
    do{
        lastsum = sum;
        sum += groupno;
        groupno++;
    }
    while(sum < n);
    
    div_t p;
    p.first = n - lastsum;
    p.second = groupno - p.first;
    
    if(groupno % 2 == 0) std::swap(p.first, p.second);
    
    return p;
}

int main(){
    int X;
    scanf("%d",&X);
    div_t p = div(X);
    printf("%d/%d",p.first,p.second);
}

 

소스가 점점 길어지는 것 같아서 여기서 한번 끊고 가겠습니다.^^

'BOJ' 카테고리의 다른 글

[BOJ] 수학 2(1)  (0) 2020.07.25
[BOJ] 수학 1(2)  (0) 2020.07.24
[BOJ] 문자열  (0) 2020.07.23
[BOJ] 함수  (0) 2020.07.23
[BOJ] 1차원 배열  (0) 2020.07.21