728x90
SMALL
백준 문제 풀이: 1940번 [주몽]
문제 링크: https://www.acmicpc.net/problem/1940
문제 설명:
주어진 재료들의 번호를 이용해 두 재료의 번호 합이 특정 숫자 M이 되는 경우의 수를 구하는 문제입니다. 재료 번호는 정수로 주어지며, 각 재료를 하나씩만 사용할 수 있습니다.
문제 해결 코드
#include <iostream>
#include <algorithm>
using namespace std;
int arr[15001];
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int n; // 재료의 개수
cin >> n;
int m; // 목표 숫자
cin >> m;
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
sort(arr, arr + n); // 배열을 정렬
int ans = 0; // 가능한 경우의 수
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (arr[i] + arr[j] > m) break; // 합이 목표 숫자를 넘으면 종료
if (arr[i] + arr[j] == m) {
ans++;
}
}
}
cout << ans << '\n'; // 결과 출력
}
코드 설명
위 코드는 모든 두 재료 쌍을 탐색하여 그 합이 M이 되는 경우의 수를 계산합니다. 주요 로직은 다음과 같습니다:
- 입력 처리: 재료의 개수와 목표 숫자 M을 입력받은 뒤, 재료 번호를 배열에 저장합니다.
- 정렬: 배열을 정렬하여 효율적인 탐색이 가능하도록 합니다.
- 브루트포스 탐색: 모든 두 재료 쌍을 확인하여 합이 M이 되는 경우를 카운트합니다.
시간 복잡도:
- 정렬: O(N log N)
- 중첩 반복문: O(N²)
따라서 전체 복잡도는 O(N log N + N²)입니다. 하지만 최적화를 통해 더 효율적인 풀이를 작성할 수 있습니다.
결과
위 코드는 문제를 해결하며, 입력에 따라 정확히 가능한 경우의 수를 출력합니다. 추가적인 최적화를 통해 성능을 개선하거나 다른 접근 방식을 제안하고 싶다면 댓글로 공유 부탁드립니다!
728x90
LIST
'BAEKJOON > 구현' 카테고리의 다른 글
백준 5598번 [카이사르 암호](C++) -yes6686- 티스토리 (0) | 2024.11.18 |
---|---|
백준 16918번 [봄버맨](C++) -yes6686- 티스토리 (0) | 2024.11.17 |
백준 10384번 [팬그램](C++) -yes6686- 티스토리 (0) | 2024.11.15 |
백준 10570번 [Favorite Number](C++) -yes6686- 티스토리 (0) | 2024.11.13 |
백준 11441번 [합 구하기](C++) -yes6686- 티스토리 (0) | 2024.11.10 |