본문 바로가기

백준/실버

[백준 1940번] 주몽 (C++)

문제링크 : https://www.acmicpc.net/problem/1940

 

1940번: 주몽

첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = INT_MAX;

int N, M, arr[15001];

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    cin >> N >> M;
    for(int i=0; i<N; i++) cin >> arr[i];
    sort(arr, arr+N);

    int l=0, r=N-1;
    int cnt = 0;
    
    while(l<r)
    {
        int tmp = arr[l] + arr[r]; //목표값
        if(tmp == M) cnt++;

        if(tmp < M) l++; //더 크게
        else r--; //더 작게
    }
    
    cout << cnt;
    return 0;
}

 

간단한 두 포인터 문제이다.

우선 두 포인터 알고리즘 사용을 위해 입력받은 배열을 정렬해준다.

 

이후에 포인터 l과 r을 움직이며, 해당 위치 값의 합이 M과 같을 때 카운팅을 해준다.

만약 합이 M보다 작다면 값을 증가시 위해 l 포인터를 증가시키고,

M보다 크거나 같다면  값을 감소시키기 위해 r 포인터를 증가시킨다.

 

'백준 > 실버' 카테고리의 다른 글

[백준 15655번] N과 M (6) (C++)  (0) 2024.03.23
[백준 2302번] 극장 좌석 (C++)  (0) 2024.03.22
[백준 11652번] 카드 (C++)  (0) 2024.03.19
[백준 11728번] 배열 합치기 (C++)  (0) 2024.03.18
[백준 1302번] 베스트셀러 (C++)  (0) 2024.03.15