본문 바로가기
Baekjoon/단계별로 풀어보기

[단계08] 기본 수학1 (9문제)

by 해적거북 2020. 12. 20.
728x90

www.acmicpc.net/step/8

 

● [문제번호 1712] 손익분기점

#include <stdio.h>

int main()
{
    int A, B, C;
    scanf("%d %d %d", &A, &B, &C);
    
    if(B >= C)
    {
        printf("%d", -1);
        return 0;
    }
    
    int count = (A / (C - B)) + 1;
    
    printf("%d", count);
    
    return 0;
}

// 손익분기점을 계산해서 {최소 판매수 = A / (C - B)보다 큰 가장 작은 정수} 이용

 

● [문제번호 2292] 벌집

#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);
    
    int count = 2;
    int range1 = 2;
    int range2 = 7;
    int gap = 6;
    
    while(1){
        if(N == 1)
        {
            count = 1;
            break;
        }
        if(range1 <= N && N <= range2)
            break;
            
        range1 += gap;
        range2 += (gap + 6);
        gap += 6;
        
        count++;
    }
    
    printf("%d", count);

    return 0;
}

 

● [문제번호 1193] 분수찾기

#include <stdio.h>

int main()
{
    int start = 1;
    int gap = 0;
    int end = start + gap;
    int flag = 1;
    int total = 2;
    
    int X;
    scanf("%d", &X);
    
    while(1)
    {
        if(start <= X && X <= end)
            break;
        
        start = end + 1;
        gap += 1;
        end = start + gap;
        
        // 1이면 홀수라인, -1이면 짝수 라인
        flag *= -1;
        total += 1;
    }
    
    if(flag == 1)
    {
        printf("%d/%d", total - (X - start) - 1, 1 + (X - start));
    }
    else if(flag == -1)
    {
        printf("%d/%d", 1 + (X - start),  total - (X - start) - 1);
    }
    
    return 0;
}

 

● [문제번호 2869] 달팽이는 올라가고 싶다

#include <stdio.h>

int main()
{
    int A, B, V;
    scanf("%d %d %d", &A, &B, &V);
    
    int sol = V - A;
    
    if(sol % (A - B) == 0)
        printf("%d", sol / (A - B) + 1);
    else // 나누었을 때 소수점이 생기는 경우 1일 추가로 계산
        printf("%d", sol / (A - B) + 2);
    
    return 0;
}

 

● [문제번호 10250] ACM 호텔

#include <stdio.h>

int main()
{
    int T;
    scanf("%d", &T);
    
    for(int i = 0; i < T; i++)
    {
        int H, W, N;
        scanf("%d %d %d", &H, &W, &N);
        
        int room = 0;
        
        if(N % H == 0)
        {
            room += H * 100;
            room += (N / H);    
        }
        else
        {
            room += (N % H) * 100;
            room += (N / H) + 1;
        }
        
        printf("%d\n", room);
    }
    
    return 0;
}

 

● [문제번호 2775] 부녀회장이 될테야

#include <stdio.h>

int room(int row, int col)
{
    if(row == 0)
        return col;
    
    int total = 0;
    
    for(int i = 1; i <= col; i++)
        total += room(row-1, i);
        
    return total;
}

int main()
{
    int T;
    scanf("%d", &T);
    
    for(int i = 0; i < T; i++)
    {
        int K, N;
        scanf("%d", &K);
        scanf("%d", &N);
        
        printf("%d\n", room(K, N));
    }
    
    return 0;
}

 

● [문제번호 2839] 설탕 배달

#include <stdio.h>

int main()
{
    int N;
    scanf("%d", &N);
    
    int min = 5000;
    int minus = -1;
    while(1)
    {
        minus++;
        if(N < minus * 5) break;
        
        // 5KG 봉지의 갯수
        int five = (N - minus * 5) / 5;
        // 3KG 봉지의 갯수를 구하기 위한 임시 변수
        int temp = N - (five * 5);
        // 3KG 봉지의 갯수
        int three = temp / 3;
        
        // 5KG, 3KG로 나누고 나머지가 있다면 다음작업
        if(temp % 3 != 0) continue;
        
        // 최소의 갯수가 되는 지 확인
        if(five + three < min)
            min = five + three;
    }
    
    if(min == 5000)
        printf("%d", -1);
    else
        printf("%d", min);
    return 0;
}

 

● [문제번호 10757] 큰 수 A+B

#include <stdio.h>
#include <string.h>

int main()
{
    // 10의 10000제곱이니 배열의 길이는 100000
    // 덧셈이니 답의 길이는 1 더 길어야 함
    char A[100000], B[100000], sol[100001];
    scanf("%s %s", A, B);
    
    int a = strlen(A);
    int b = strlen(B);
    
    char *longer, *shorter;
    
    int gap;
    
    // 자릿수에 따라 긴 수, 짧은 수 정하기
    if(a > b)
    {
        longer = A;
        shorter = B;
        
        gap = a - b;
    }
    else
    {
        longer = B;
        shorter = A;
        
        gap = b - a;
    }
    
    // 올림이 있는 경우의 변수
    int carry = 0;
    
    // 문자열의 뒤에서 부터 읽기
    for(int i = strlen(shorter) - 1; i >= 0; i--)
    {
        int tempLong = longer[i + gap] - '0';
        int tempShort = shorter[i] - '0';
        
        int sum = tempLong + tempShort + carry;
        
        // 올림 변수 리셋
        carry = 0;
        
        longer[i + gap] = sum % 10 + '0';
        
        // 올림이 있는 경우
        if(sum >= 10)
            carry = 1;
    }
    
    // 마지막 올림이 있는 경우
    if(carry == 1)
    {
        // 자릿수가 동일하면 맨 앞에 1추가
        if(a == b)
            sol[0] = '1';
            
        // 자릿수가 다른 경우
        else
        {
            while(1)
            {
            
                int temp = longer[gap - 1] - '0' + carry;
                
                longer[gap - 1] = temp % 10 + '0';
                
                gap--;
                
                // 올림이 더이상 없는 경우
                if(temp < 10)
                    break;
                
                // 최고 자릿수에 도달한 경우
                if(gap == 0)
                {
                    sol[0] = '1';
                    break;
                }
            }
        }
    }
    
    strcat(sol, longer);
    
    printf("%s", sol);
    
    return 0;
}

 

● [문제번호 1011] Fly me to the Alpha Centauri

#include <stdio.h>
#include <math.h>

int main()
{
    int T;
    scanf("%d", &T);
    
    for(int i = 0; i < T; i++)
    {
        int x, y;
        scanf("%d %d", &x, &y);
        
        int distance = y - x;
        // 만약 temp를 하나씩 체크하며 찾을 경우 시간초과 발생
        int temp = sqrt(distance);
        
        int gap = distance - (temp * temp);
        
        if(gap == 0)
            printf("%d\n", 2 * temp - 1);
        else if(gap <= temp)
            printf("%d\n", 2 * temp);
        else if(gap > temp)
            printf("%d\n", 2 * temp + 1);
    }
    
    return 0;
}
728x90

댓글