본문 바로가기

코딩테스트/백준

[백준] 1940번 : 주몽

728x90
반응형


🔗문제 링크

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

 

1940번: 주몽

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

www.acmicpc.net

👩‍💻코드

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    
    int N;
    int M;
    vector<int> numbers(N,0);
    
    cin >> N;
    cin >> M;
    
    for (int i=0; i<N; i++){
        int number;
        cin >> number;
        numbers.push_back(number);
    }
    
    sort(numbers.begin(), numbers.end());
    
    int start_index = 0;
    int end_index = N-1;
    int count = 0;
    
    while (start_index < end_index){
        int sum = numbers[start_index] + numbers[end_index];
        
        if(sum == M){
            count++;
            start_index++;
            end_index--;
        }else if(sum < M){
            start_index++;
        }else{
            end_index--;
        }
    }
    
    cout << count << "\n";
}

✏️풀이

Do it! 알고리즘 코딩테스트 - C++ 편 : 기출 유형 분석부터 문제 풀이 비법까지!를 참고하였습니다.

이전 문제에서의 풀이법과 동일하게 투 포인터라는 알고리즘을 사용합니다.

 

먼저 투 포인터로 비교할 수 있도록 주어진 재료들 값을 오름차순으로 정렬해줍니다.

정렬 후 start_index는 앞에서부터, end_index는 뒤에서부터 위치합니다.

 

두 포인터의 합이 m보다 작거나 크면 start_index를 하나 뒤로 옮기거나 end_index를 하나 앞으로 옮깁니다.

정답인 경우는 두개의 포인터를 모두 움직입니다.

728x90
반응형

'코딩테스트 > 백준' 카테고리의 다른 글

[백준] 12891번 : DNA 비밀번호  (0) 2024.09.05
[백준] 1253번 : 좋다  (1) 2024.03.04
[백준] 2018번 : 수들의 합 5  (2) 2024.02.29
[백준] 10986번 : 나머지 합  (1) 2024.02.09
[백준] 11660번 : 구간 합 구하기 5  (2) 2024.02.06