[코테3_6] 최대 길이 연속부분수열

byeol·2022년 12월 2일
0

코딩테스트

목록 보기
23/42

✔ 내 답-> 이상핟..

import java.util.*;

public class P3_6 {
 public static int solution(int n, int k, int[] arr){
  int cnt=0, i=0,p=0,max=0,zero=0;

  while(i<n-1){ 
   if(zero==k) {
      while(arr[i]==1){
        cnt++;
        i++;
         }
       if(max<cnt) max=cnt;
       System.out.println("max="+max);
       cnt=0;
       zero=0;
       if(k>1) i=p;
   }
   else if(zero<k){
      if(arr[i]==0){
        zero++;
        if(zero==2) p=i;
        }
       i++;
       cnt++;
   }
 }
   return max; 
 }
 public static void main(String[] args){
  Scanner kb = new Scanner(System.in);
  int n = kb.nextInt();
  int k = kb.nextInt();
  int[] arr = new int[n];
  for(int i=0;i<n; i++){
    arr[i]=kb.nextInt();  
  }
  System.out.println(solution(n, k, arr )); 

 }
}

✔️ 강의 조금 듣고 힌트 얻어서 풀어본 결과
뭔가 컴퓨터가 접근하기 편한 간단한 방법을 고안해내는 연습이 필요한 거 같다.

최적의 최적의 방법을 찾는 것보다는
최적의 방법 안에서 단순하게 가는 것이다.

최적의 최적의 방법은 인간 머리로 생각하는 것이라 방법이 더 복잡해지고 중간에 많은 if문과 변수 선언들이 생기기 때문에 더 복잡해진다.

import java.util.*;

public class Main {
 public static int solution(int n, int k, int[] arr){
   int lt =0, rt=0, answer = 0, cnt=0, first=0;
   int zero=0;
   
   while(rt<n) {
   if(zero<k) {
	   if(arr[rt]==0) {
		   zero++;
		   if(zero==1) first=rt+1;
	   }
	   rt++;
   }
   else if(zero==k){
	   if(arr[rt]==0) {
		   cnt=rt-lt;
		   zero=0;
		   if(answer<cnt) answer = cnt;
		   lt=first;
		   rt=first;
	   }
	   else {
		   rt++;
	   }
	   
   }
   }
   return answer;
 }
 public static void main(String[] args){
  Scanner kb = new Scanner(System.in);
  int n = kb.nextInt();
  int k = kb.nextInt();
  int[] arr = new int[n];
  for(int i=0;i<n; i++){
    arr[i]=kb.nextInt();  
  }
  System.out.println(solution(n, k, arr )); 

 }
}

✔️강의 답

import java.util.*;

public class Main {
 public static int solution(int n, int k, int[] arr){
  int lt =0,rt=0, cnt=0, answer=0,length=0;
  
   while(rt<n) {
   if(cnt<k) {
	   if(arr[rt]==0) cnt++;
	   length=rt-lt+1;
       if(length>answer) answer=length;
       rt++;
   } else if(cnt==k){
	   if(arr[rt]==1) {
		   length=rt-lt+1;
	       if(length>answer) answer=length;
	       rt++;
	   } else cnt++;
   } else {
	   while(arr[lt]==1) {
		   lt++;
	   }
	   if(arr[lt]==0) {
		   lt++;
		   cnt--;
		   length=rt-lt+1;
		   if(length>answer) answer=length;		  
		   rt++;
	   }	   
      }
   	    
   }
   return answer;
  
 }
 public static void main(String[] args){
  Scanner kb = new Scanner(System.in);
  int n = kb.nextInt();
  int k = kb.nextInt();
  int[] arr = new int[n];
  for(int i=0;i<n; i++){
    arr[i]=kb.nextInt();  
  }
  System.out.println(solution(n, k, arr )); 

 }
}
import java.util.*;

public class Main {
 public static int solution(int n, int k, int[] arr){
  int lt =0, cnt=0, answer=0;
  
  for(int rt=0;rt<n;rt++) {
	  if(arr[rt]==0) cnt++;
	  while(cnt>k) {
		  if(arr[lt]==0)cnt--;
		  lt++;
	  }
	  answer = Math.max(answer, rt-lt+1); 
   }
   return answer;
  
 }
 public static void main(String[] args){
  Scanner kb = new Scanner(System.in);
  int n = kb.nextInt();
  int k = kb.nextInt();
  int[] arr = new int[n];
  for(int i=0;i<n; i++){
    arr[i]=kb.nextInt();  
  }
  System.out.println(solution(n, k, arr )); 

 }
}
profile
꾸준하게 Ready, Set, Go!

0개의 댓글