4장 기본적인 알고리즘
[36] 1~N 의 합을 구하려면 반복 처리한다
- 0으로 초기화된 변수 sum에 1~N의 값을 차례대로 더해서 합계를 구한다.
const sumOneToN = (n) => {
let sum = 0;
for(let i=1; i<=n; i++) {
sum += i;
}
return sum;
};
[37] 수열의 값을 유지하려면 배열을 사용한다
- 피보나치 수열은 1번째 요소의 값에 0을, 2번째 요소에 1을, 3번째 이후의 값은 앞의 2칸의 합을 배열에 순서대로 저장해서 구한다.
const getFivo = (n) => {
let fivo = [0, 1];
for(let i=2; i<n; i++) {
fivo[i] = fivo[i-2] + fivo[i-1];
}
return fivo;
};
[38] 배열 데이터의 합을 계산하려면 더한 값을 저장할 변수를 준비한다.
- 배열 요소의 합을 구하는 변수 sum을 준비하고 0으로 초기화 시킨다.
- 반복 처리 중에 차례대로 더해지는 요소의 값을 구한다.
const arr = [40, 13, 89, 52, 7];
const getSum = (arr) => {
const reducer = (acc, cur) => {
return acc + cur
};
return arr.reduce(reducer);
};
console.log(getSum(arr));
👉 reduce 참고
[39] 배열 안의 요소의 개수를 구하려면 카운터를 준비한다
- 데이터의 개수를 세는 변수 count를 준비하고 0으로 초기화시킨다.
- 배열 요소가 ‘보초 값’이 아닐 동안 변수 count를 카운트 업 한다.
const getArrayLength = (array) => {
let count = 0;
while (true) {
if (array[count] === -1) {
break;
}
count += 1;
}
return count;
};
[40] 배열 데이터의 평균 값은 반복 처리를 통해 합계와 개수를 구한 후 계산한다
- ‘보초 값’을 찾을 때까지 count(데이터 수)와 sum(합계)를 계산하고, 마지막으로 sum / count 를 계산하여 평균을 구한다.
const getAverage = (array) => {
let count = 0;
let sum = 0;
while (array[count]!== -1) {
sum += array[count]
count += 1;
}
return (sum/count);
};
[41] 배열의 최대값을 구하려면 최대값을 저장할 변수를 준비한다
- 변수 max를 비교할 데이터들보다도 작은 값으로 초기화 시킨다.
- 배열요소의 값 > max이면 max에 배열 요소의 값을 대입한다.
const getMax = (array) => {
let max = 0;
for (let i=0; i<array.length; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
};
[42] 배열의 최소값을 구하려면 최소값을 저장할 변수를 준비한다
- 변수 min을 비교할 데이터들보다도 큰 값으로 초기화 시킨다.
- 배열요소의 값 < min이면 min에 배열요소의 값을 대입한다.
const getMin = (array) => {
let min = 999;
for (let i=0; i<array.length; i++) {
if (array[i] < min) {
min = array[i];
}
}
return min;
};
[43] 배열 데이터에 등수를 매기려면 순위를 저장할 또 다른 배열을 준비한다
- 1로 초기화 된 배열을 준비하고, 데이터가 저장된 모든 배열 요소와 다른 배열 요소들의 값을 비교한다.
- 작다면 1을 증가시켜서 등수를 구한다.
const getRankArray = (array) => {
const rank = array.map(a => {return 1;});
for(let i=0; i<array.length; i++) {
for(let j=0; j<array.length; j++) {
if (array[i] < array[j]) {
rank[i] += 1;
}
}
}
return rank;
};
[44] 시간의 크고 작음을 비교하려면 단위를 초단위로 통일한다.
- 시 → 분 → 초 순으로 크고 작음을 비교할 수도 있지만 조금 복잡해진다.
- ‘시 분 초'의 크고 작음을 비교하기에 앞서서 단위를 '초’단위로 통일시킨다.
TIME1 = H1*3600 + M1*60 + S1
TIME2 = H2*3600 + M2*60 + S2
if (TIME1 > TIME2) {
'H1시 M1분 S1초가 더 크다'
} else if (TIME1 < TIME2){
'H2시 M2분 S2초가 더 크다'
} else if (TIME1 = TIME2){
'H1시 M1분 S1초와 H2시 M2분 S2초는 같다'
}
[45] 시간차를 구할 때는 초단위로 바꾸어 뺄셈하고, 다시 시간으로 바꾼다.
- 시간차를 구하려면 우선 초 단위 값으로 바꾼다.
- 시간차를 초 단위로 구하고, 그 값을 다시 ‘시 분 초’로 되돌린다.
TIME1 = 7*3600 + 10*60 + 52
TIME2 = 14*3600 + 20*60 + 50
DIFF = TIME2 -TIME1
HOUR = DIFF / 3600
MINUTE = (DIFF % 3600) / 60
SECOND = ((DIFF % 3600) % 60) / 60
=> 7시간 9분 58초
[46] 두 변수의 값을 교환할 때는 임시 변수를 사용한다.
- 두 변수의 값을 교환하려면 임시 변수를 사용한다.
- 먼저 덮어 씌울 변수의 값을 임시 변수에 대피시킨다.
let x = 10;
let y = 25;
let w = y;
y = x;
x = w;
[47] 두 수의 최대공약수는 유클리드 호제법으로 구한다.
- 유클리드 호제법은 ' x를 y로 나눈 나머지 값을 r이라고 했을 때, x, y의 최대공약수는 y와 r의 최대공약수와 같다'라고 정리한다.
const getGCD = (x, y) => {
let r;
while (r != 0) {
r = x % y;
x = y;
y = r;
}
return x;
}