본문 바로가기

C언어

2025년 여름학기 6주차 C언어

#include <stdio.h>

int main() {
    int N;
    scanf("%d", &N);

    int x[N + 1]; // 1부터 N까지 저장할 배열이다

    x[1] = 0; // 1은 이미 1이므로 연산 횟수가 0
    
    //동적 계획법을 for문을 이용해 사용한다
    for (int i = 2; i <= N; i++) {
        x[i] = x[i - 1] + 1; // 1을 빼는 연산이다. 언제든 가능하니 if문을 쓰지 않는다

        if (i % 2 == 0 && x[i] > x[i / 2] + 1) {
            x[i] = x[i / 2] + 1; // 2로 나누는 연산
        }
        if (i % 3 == 0 && x[i] > x[i / 3] + 1) {
            x[i] = x[i / 3] + 1; // 3으로 나누는 연산
        }
    }
    
    //N에 10을 입력할 경우 1부터 10까지 전부 각각의 최소 계산 횟수를 확인한다

    printf("%d\n", x[N]);

    return 0;
}

 

#include <stdio.h>
#include <stdlib.h>  // llabs를 사용하기 위해서다(long long타입의 정수 절댓값)
#define ll long long //long long은 길어서 이렇게 해준다

ll min(ll a, ll b) { return a < b ? a : b; }
ll max(ll a, ll b) { return a > b ? a : b; }
//각각 min과 max를 반환한다


int main() {
    ll X, Y, W, S;
    scanf("%lld %lld %lld %lld", &X, &Y, &W, &S);

    ll T1 = (X + Y) * W; // 전부 직선일 때
    ll T2 = min(X, Y) * S + llabs(X - Y) * W; // 대각선과 직선이 섞인다
    ll T3; //전부 대각선일 때

    if ((X + Y) % 2 == 0) {
        T3 = max(X, Y) * S; // 둘 다 대각선으로 끝낼 수 있음
    } else {
        T3 = (max(X, Y) - 1) * S + W; // 마지막 1블록은 직선으로
    }

    ll result = min(T1, min(T2, T3));
    printf("%lld\n", result);

    return 0;
}

'C언어' 카테고리의 다른 글

2025년 여름학기 8주차 C언어  (2) 2025.08.17
2025년 여름학기 7주차 C언어  (1) 2025.08.08
2025년 여름학기 5주차 C언어  (1) 2025.07.27
2025년 여름학기 4주차 C언어  (3) 2025.07.19
2025년 여름학기 3주차 C언어  (1) 2025.07.11