1940번: 주몽
첫째 줄에는 재료의 개수 N(1 ≤ N ≤ 15,000)이 주어진다. 그리고 두 번째 줄에는 갑옷을 만드는데 필요한 수 M(1 ≤ M ≤ 10,000,000) 주어진다. 그리고 마지막으로 셋째 줄에는 N개의 재료들이 가진 고
www.acmicpc.net
<풀이>
어제 푼 문제 복습 겸 투포인터 문제를 풀어보았다.. 어제 문제랑 접근 법이 아주 동일하다
필요한 수 값의 범위 때문에 for문을 돌릴경우 당연히 시간초과가 발생한다. 고로 투포인터로 접근하면 된다.
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n,m;
vector<int> vec;
int main(void){
cin>>n;
cin>>m;
for(int i=0; i<n; i++){
int num;
cin>>num;
vec.push_back(num);
}
sort(vec.begin(),vec.end());
int left = 0 , right = n-1, cnt =0;
while(left<right){
int sum = vec[left]+vec[right];
if(sum == m) {
cnt++;
right--;
}
else if(sum>m){
right--;
}
else left++;
}
cout<<cnt<<"\n";
}
1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
<풀이>
투포인터 재밌네,, 이 문제 또한 투포인터 !!!!
1. 시작 점 부터 더해주면서 해당 값에 도달or 넘었는지 확인
2. 넘었다면 도달한 거리를 갱신해주고 ->최단거리를 구하기 위해 시작점을 이동시켜주며 더해준 값을 빼줌
3. 합이 아직 부족하다면 배열의 길이를 늘려간다 / 이 때 배열에 끝에 도달했는데도 합을 충족시키지 못한다면 반복문을 나온다
4. 초기값에 따라 부분합을 구할 수 있는지 or 최단거리가 있는지 출력해준다.
문제 난이도는 골드인데 위에 푼 실버랑 크게 큰 차이는 없는 느낌..?
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
int n,m;
vector<int> vec;
int main(void){
cin>>n>>m;
for(int i=0; i<n; i++){
int num;
cin>>num;
vec.push_back(num);
}
int st =0,end =0, sum=vec[0], ans = 214700000;
while(st<=end){
if(sum>=m){
ans = min(ans, (end-st)+1);
sum -= vec[st++];
}
else if(sum<m){
if(end == n) break;
sum +=vec[++end];
}
}
if(ans ==214700000 ) cout<<0<<"\n";
else cout<<ans<<"\n";
}
'Algorithm > BOJ' 카테고리의 다른 글
| [ 백준 ] 54일차 - 3273번/16431번/10988번/2744번/9933번 (0) | 2021.11.09 |
|---|---|
| [ 백준 ] 53일차 - 1189번 /1316번 (0) | 2021.11.08 |
| [ 백준 ] 52일차 - 6497번/14912번/9996번 (0) | 2021.10.20 |
| [ 백준 ] 51일임 - 1719번/9655번/14405번 (0) | 2021.10.18 |
| [ 백준 ] 50일차 - 2417번/ 4386번 (0) | 2021.10.17 |