차근차근 시간날 때마다 알고리즘을 풀고 있다.
이번에는 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 리턴하기
}
'JavaScript' 카테고리의 다른 글
JavaScript - 배열에서 원하는 인덱스만 삭제하기 (Splice / Filter) (0) | 2022.06.08 |
---|---|
CSS - 테이블 row 홀수 짝수 번째 태그에만 스타일 적용하기 (0) | 2022.05.13 |
JavaScript 알고리즘(6) Multiple Pointers Pattern -areThereDuplicates (0) | 2022.04.09 |
CSS - z-index 적용 안될때 (Why your z-index isn't working) (0) | 2022.04.04 |
JavaScript 알고리즘(5) Same Frequency Counter Pattern (0) | 2022.03.23 |
댓글