[JS][프로그래머스 -LEVEL 2 -두 큐 합 같게 만들기 ]

정대만·2023년 7월 11일

코딩테스트

목록 보기
23/51
post-thumbnail

문제

이것을 보면 딱봐도 슬라이딩 윈도우 문제라는것을 알수 있다. 두큐를 일렬로 세운다음 . > 슬라이딩 윈도우 로 풀어야 시간 오류가 나지않는다.

제한사항이 30만이기 때문에 for 문을 한번 돌려야한다.
시간 오류가 발생하기 때문에 , queue1 를 기준으로 3번 돌린다는 가정으로 한다.

틀린 코드

function solution(queue1, queue2) {
  // 슬라이딩 윈도우 기법같은디 
  // 
  var concat__qula= queue1.concat(queue2);
  var first_queal=queue1.reduce((acc, cur) => { return acc += cur; }, 0);
  var second_queal=queue2.reduce((acc, cur) => { return acc += cur; }, 0);   var total_count=-1;
   var final= Math.floor( (first_queal+second_queal)/2);
  if( Math.floor((first_queal+second_queal) %2)==1){
      return -1;
  }
   var front=0; 
   var back=queue1.length-1;
   while(front< concat__qula.length){
    
       total_count+=1;
      if(first_queal==final){
          break;
      }
      if(first_queal<final) {
           back+=1;
          first_queal+=concat__qula[back];
          continue;
      }
      if(first_queal>final){
           first_queal-=concat__qula[front];
          front+=1;
          continue;
      }
      
   }
   return (total_count==concat__qula.length+1 ?-1:total_count)
}

28번에서 시간 오류가 나서 다시 풀게 되었다.
다른 사람 코드를 참조했다.

function solution(queue1, queue2) {
  // 슬라이딩 윈도우 기법같은디 
  // 
  var concat__qula= queue1.concat(queue2);
  var first_queal=queue1.reduce((acc, cur) => { return acc += cur; }, 0);
  var second_queal=queue2.reduce((acc, cur) => { return acc += cur; }, 0);   var total_count=-1;
   var final= Math.floor( (first_queal+second_queal)/2);
  if( Math.floor((first_queal+second_queal) %2)==1){
      return -1;
  }
   var front=0; 
   var back=queue1.length-1;
   for(var i=0; i<queue1.length*3; i++){
      if(first_queal==final){
          return i;
      }
      if(first_queal<final) {
           back+=1;
          first_queal+=concat__qula[back];
          continue;
        
      }
      if(first_queal>final){
           first_queal-=concat__qula[front];
           front+=1;
            continue;
        
      }
      
   }
   return -1
}

풀이방식

하나빼고 하나넣고를 각각 count 하기 때문에 continue를 줘서 i 를 증가하는식으로 두었다.
슬라이딩 윈도우 방식을 이용해서 기준이 되는 큐가 작으면 back 플러스하고 큰경우 뒤에있는 front 포인터를 삭제해준다. 이런식으로 가면 정답이 나온다.

profile
안녕하세요

0개의 댓글