diff --git a/11/14503.c++ b/11/14503.c++ new file mode 100644 index 0000000..19a4bcb --- /dev/null +++ b/11/14503.c++ @@ -0,0 +1,68 @@ +#include +#include + +using namespace std; +typedef pair p; + +int cnt = 0; + +p direction(int d){ + switch(d){ + case(0): //북 + return {-1,0}; + case(1): //동 + return {0,1}; + case(2): //남 + return {1,0}; + case(3): //서 + return {0,-1}; + } +} + +//특정 경로가 있는 탐색이므로 dfs를 사용하였다. +void move(int r, int c,int d, vector>& v){ + if(v[r][c]==0){ + cnt++; + v[r][c]=-1; + } + + for(int i=0;i<4;i++){ + d--; + if(d<0) d=3; //반시계 방향 회전 (북-서-남-동) + p dd = direction(d); + + int next_r = r + dd.first; + int next_c = c + dd.second; + + if(v[next_r][next_c]==0){ //청소할 블록이 있는 경우 dfs + move(next_r, next_c, d, v); + } + } + //주변에 청소할 블록이 없는 경우 후진 + p dd = direction(d); + int next_r = r - dd.first; + int next_c = c - dd.second; + + if(v[next_r][next_c]!=1) { //후진할 블록이 벽이 아닌 경우 dfs + move(next_r, next_c, d, v); + } + + else cout<< cnt; + exit(0); +} + +int main(){ + int n, m, r, c, d; + cin >> n >> m >> r >> c >> d; + + vector> v(n,vector(m,0)); + for(int i=0;i> v[i][j] ; + } + } + + move(r,c,d,v); + + return 0; +} \ No newline at end of file diff --git a/11/20437.c++ b/11/20437.c++ new file mode 100644 index 0000000..2a3315a --- /dev/null +++ b/11/20437.c++ @@ -0,0 +1,53 @@ +#include +#include +#include + +using namespace std; +typedef pair p; + +int cnt = 0; + +void find(int k, vector>& num, int min){ + int max_length=0, min_length=min+1; + int length=0; + + for(int i=0;i<27;i++){ + if(num[i].size()>=k){ + for(int j=0;j<=num[i].size()-k;j++){ + length = num[i][j+k-1] - num[i][j] + 1; + if(length>max_length) max_length=length; + if(length> t; + while(t--){ + cin >> s >> k; + vector v; + vector> num(27,vector(0,0)); + + for(int i=0;i +#include + +using namespace std; +const int NUM=100001; + +int findMax(int k, vector& v){ + vector num(NUM, 0); //윈도우에 들어온 수를 인덱스 번호로 저장 + + int max=0, length=0, start=0; //최장 길이, 현재 길이, 수열 시작 포인터터 + for(int i=0;imax) max = length; + continue; + } + //중복 수가 k개 이상일 경우 max값 업데이트 후 초기화 + for(int j=start; j<=i;j++){ + length--; + num[v[j]]--; + if(v[j]==v[i]){ + start=j+1; + length++; + break; + } + } + } + + return max; +} + +int main(){ + int n, k; + cin >> n >> k; + + vector v(n,0); + for(int i=0;i> v[i]; + } + + cout << findMax(k,v); + + return 0; +} \ No newline at end of file diff --git a/11/2531.c++ b/11/2531.c++ new file mode 100644 index 0000000..b9556de --- /dev/null +++ b/11/2531.c++ @@ -0,0 +1,62 @@ +#include +#include + +using namespace std; + +// 1. "회전" 초밥이므로 회전하여 만들 수 있는 묶음도 생각한다. +//k개의 묶음을 확인하려고 한다면, 0부터 k-1까지의 초밥을 vector의 뒷부분에 넣어준다. //즉, 총 n+k크기의 vector에 초밥 정보를 저장하게 된다. + +//2. 슬라이딩 윈도우 방식을 사용해서 연속 k개의 초밥 중 다른 종류의 초밥 수(cnt)를 샌다. +//이를 위해 초밥 종류에 대한 벡터 vector susi(d,0)를 사용한다. +//초밥 수를 샌 후에 쿠폰 초밥의 value가 0이라면 cnt 를 1증가해준 후에 max값에 반영해주고 다시 1을 빼준다. + +//3. max를 출력한다. + +int findMax(int k, int c, int d, vector& v){ + vector susi(d+1,0); + int cnt=0; + for(int i=0;imax) max=cnt; + } + return max; +} + +int main(){ + int n,d, k, c; + cin >> n >> d >> k >> c; + + //입력 + vector v(n+k,0); + for(int i=0;i> num; + v[i]=v[n+i]=num; + } + for(int i=k;i> v[i]; + } + + cout << findMax(k,c,d,v); + + return 0; +} \ No newline at end of file