본문 바로가기
JavaScript

JavaScript 알고리즘(7) Multiple Pointers Pattern - averagePair

by 새발개발JA 2022. 4. 26.
반응형

 

 

 

차근차근 시간날 때마다 알고리즘을 풀고 있다. 

이번에는 Multiple Pointers 패턴에서 평균구하기 문제이다.

 

실컷 고민하다 결국 지난번 패턴과 같은 공식을 적용했더니 별문제 없이 통과를 했기 때문에, 

이번에는 다른 사람의 풀이를 가지고 와 분석해보았다.

 


JavaScript 알고리즘(7) Multiple Pointers Pattern - averagePair

 

매개변수로는 array 와 average가 주어지고, 

array 를 검사해서 두 수를 더한 평균이 average 와 같으면, 통과! (true) 이고, 같은 average 가 없다면  false 이다.

 

 

 

나의 풀이

while 문으로 계속 조건이 맞을때까지 무한반복하도록 만들었다.

if 문으로 (맨앞과 + 맨뒤 숫자 / 2) 로 만든 평균값으로 매개변수avg와 비교해서,

같으면 패쓰!(true) 아니면  뒤에서 -1로 하나씩 좁혀오고, 맨앞의 값과 다시 비교한다.

맨뒤값이 -1 계속 줄어들다 === 맨앞숫자와 같아지면,  맨앞 숫자를 +1 해주고 맨뒤는 다시 reset !

그렇게 평균값과 주어진 평균값을 계속 비교해서 같으면 true로 빠져나오고, 아니면 false 로 최종으로 나온다.

function averagePair(arr, avg){
    var first = 0;
    var last = arr.length-1;
    
    while(first < last) {
        if((arr[first] + arr[last]) / 2 === avg) {
            return true;
        } else {
            last--;
            if(first === last){
                first++;
                last = arr.length-1;
            }
        }
    }
    return false;
}

 

 

다른 사람의 풀이

나의 풀이와 시작은 비슷하다. 맨앞과 맨뒤 포인터를 지정하고 while 문을 이용해 무한 루프를 돌린다.

if 문으로 평균값을 비교해서 같으면 true로 나오는 것까지는 같은데,

만들어낸 평균값이 > 매개변수 평균값보다 크면 뒤에서 -1로 하나씩 좁혀오고,

만들어낸 평균값이 < 매개변수 평균값보다 작으면 맨앞을 +1 해준다.

(↑나는 이 차이가 크다고 생각하는데, 그 이유는 필요없이 끝까지 검사할 필요가 없기때문이다.

  조건이 안맞으면 끊고 다음 수로 넘어간다. 이게 더 효율적인 것 같다. )

function averagePair(array, avg) {
   let first = 0
   let last = array.length - 1
   
   while (first < last) {
      let average = (array[first] + array[last]) / 2 	 // 현재 맨앞+맨뒤의 평균을 산출
      
      if (average === avg) {	  // 산출해낸 평균과 매개변수로 들어온 평균을 비교
         return true; 		  // 같으면 true 를 리턴
      } else if (average > avg) { // 산출한 평균이 > 매개변수의 평균보다 더 크면  
         last--			  // 맨뒤 숫자를 하나씩 줄여간다.
      } else {			  // 산출한 평균이 매개변수(avg)보다 더 작으면 
         first++		  // 맨앞 숫자를 늘린다.
      }
   }
   return false;		// while문을 다돌았는데도 평균값이 없으면 false 리턴하기
}

 

 

 

 

 

반응형

댓글