Replies: 1 comment
-
이런식으로 덱으로도 풀 수 있어용 // 언어 : C++ , (성공/실패) : 1/1 , 메모리 : 5404 KB , 시간 : 60ms
#include <iostream>
#include <vector>
#include <deque>
#include <algorithm>
#include <string.h> // memset
using namespace std;
vector<int> v;
deque<int> dq;
int main(void){
// 입출력 속도 최적화
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int N,K; cin>>N>>K;
for(int i=0;i<N;i++){
int tmp;
cin>>tmp;
if(tmp==1){ // vector에 라이언의 좌표만 담기
v.push_back(i);
}
}
// 라이언이 K개 미만이라면 안되는 경우이므로 -1
if(v.size() < K) {
cout<<-1<<'\n';
return 0;
}
// 덱에 초기값 넣기
for(int i=0;i<K;i++){
dq.push_back(v[i]);
}
int len = dq.back() - dq.front() + 1;
// 라이언의 개수만큼 덱으로 앞에서빼고 뒤에서 넣기
for(int i=K;i<v.size();i++){
dq.pop_front(); // 앞에서 빼기
dq.push_back(v[i]); // 뒤에서 넣기
len = min(len, dq.back() - dq.front() + 1); // (맨뒤 라이언 좌표) - (맨앞 라이언 좌표) + 1
}
cout<<len<<'\n';
return 0;
} |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
문제
https://www.acmicpc.net/problem/15565
난이도 : 실버 1
아이디어
연속 부분 수열에 관한 문제이므로 투 포인터 알고리즘으로 먼저 접근해보았다.
L과 R 포인터를 1로 설정한 후 R 포인터를 라이언 인형이 K개가 되도록 옮겨준 후 답을 갱신한다. 그 후 L 포인터를 옮겨준 후 위에 했던 R 포인트 옮기기 과정을 반복하면 된다.
이거 근데 for문 안에 while 문이라서 시간 복잡도가 O(N2)이 걸리는데 N의 최댓값이 10만이라서 최악의 경우 1초가 넘어갈 거라고 생각했는데 통과했다.
왜지..? 최악의 경우를 생각해보면 L과 R이 N까지 이동할텐데 그럼 분명 시간 초과가 나야하는데..
구현
Beta Was this translation helpful? Give feedback.
All reactions