프로그램 언어/BaekJoon

백준 알고리즘 - 2798

찬영_00 2025. 5. 28. 21:46
728x90

https://www.acmicpc.net/problem/2798

 

오늘은 백준 문제를 풀어보았다.

 

C언어로 풀었고, 기록용으로 남겨둔다.

 

먼저 내가 푼 방법이다.

#include <stdio.h>
#include <malloc.h>

int main() {
    //N : 카드 장수 , M : 근접해야하는 수
    int N, M;

    scanf("%d %d", &N, &M);
    // 각 카드의 숫자

    int* num = (int*)malloc(sizeof(int) * N);
    int check = 300000, com = 0, result = 0;

    for (int i = 0; i < N; i++) {
        scanf("%d", &num[i]);
    }

    for (int i = 0; i < N; i++) {
        for (int j = i+1; j < N; j++) {
            for (int k = j+1; k < N; k++) {
                com = M - (num[i] + num[j] + num[k]);
                if (com >= 0 && check >= com) {
                    check = com;
                    result = num[i] + num[j] + num[k];
                }
            }
        }
    }

    printf("%d\n", result);
    free(num);
    return 0;
}

 

그리고 아래는 gpt가 푼 방식이다.

#include <stdio.h>

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

    int num[100];  // 문제 제한상 충분함
    for (int i = 0; i < N; i++) {
        scanf("%d", &num[i]);
    }

    int result = 0;

    for (int i = 0; i < N - 2; i++) {
        for (int j = i + 1; j < N - 1; j++) {
            for (int k = j + 1; k < N; k++) {
                int sum = num[i] + num[j] + num[k];
                if (sum == M) {
                    printf("%d\n", M);  // 최적값 즉시 출력 후 종료
                    return 0;
                }
                if (sum < M && sum > result) {
                    result = sum;
                }
            }
        }
    }

    printf("%d\n", result);
    return 0;
}

 

확실히 차이가 난다,, 내꺼에서 불필요한 것들을 없애니 훨씬 보기 편하고 최적화가 잘 되어 있다.

 

특히 변수선언과 중간에 정답이 있으면 끊어주고, 불필요한 행위(for문 참조) 하지 않음으로써 코드의 성능을 높히고, 가독성이 좋게 동적 할당도 하지 않은 모습이다.

 

나중에 참고해서 문제 풀 때 써먹어봐야겠다.

728x90

'프로그램 언어 > BaekJoon' 카테고리의 다른 글

벌집  (0) 2025.03.02
DP(Dynaminc Programming)- 4  (1) 2022.07.26
DP(Dynaminc Programming)-3  (0) 2022.07.05
DP(Dynaminc Programming)-2  (0) 2022.06.27
DP(Dynaminc Programming)-1  (0) 2022.06.23