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 |