12와 18의 약수
12: 1, 2, 3, 4, 6, 12
18: 1, 2, 3, 6, 9, 18
최대공약수
최대공약수를 알기 전, 공약수는 두 수 혹은 그 이상의 여러수의 공통인 약수를 뜻한다.
최대공약수는 이름 그대로 공약수 중 가장 큰 것을 가리킨다.
위에 나와있는 12와 18의 약수 중 공통된 수중에 제일 큰 숫자가 최대공약수이고 6이다.
유클리드 호제법
2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다.
이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다.
-위키위키백과백과
풀이방식
유클리드 호제법과 재귀함수를 이용하여 풀면 쉽게 풀 수 있을 것 같다.
const solution = (a,b) => {
if(a<b) [a,b]=[b,a];
return a%b === 0 ? b : solution(b,a%b);
}
const solution = arr =>{
let odd = 0, even = 0;
arr.forEach(e => {
if (e%2 === 0) {
even++;
}else{
odd++;
}
});
return [odd, even];
}
* 풀이방식
문자열을 역순으로 배치하고 알파벳을 하나씩 옮기는 문제로, 하나씩 잘라서 변환하여 넣는 것보다
배열화 시켜서 forEach로 하나씩 오른쪽으로 이동하고 unshift를 통해 다른 배열에 역순으로
넣은 후 join 메서드를 통해 리턴하는 방향으로 생각했다.
const solution = str =>{
const rtnArr = [];
[...str].forEach(chr=>{
if(chr!=='z') rtnArr.unshift(String.fromCharCode(chr.charCodeAt()+1));
else rtnArr.unshift('a');
});
return rtnArr.join("");
}
const solution = arr => {
const myMap = new Map();
let max=0;
for(let i=0; i<arr.length; i++){
for(let j=i; j<arr.length; j++){
if(!myMap.has(arr[j])){
myMap.set(arr[j],0);
}else{
max > myMap.size ? max = max : max = myMap.size ;
myMap.clear();
break;
}
if(j === arr.length-1) j=-1;
}
}
return max;
}
const solution = (num,k) => {
const numArr = [...num];
let temp = [];
let remove = k;
for(let i=0; i<numArr.length; i++){
while(remove>0 && temp.length>0 && temp[temp.length-1]<numArr[i]){
temp.pop();
--remove;
}
temp.push(numArr[i]);
}
temp = temp.slice(0, temp.length-remove);
return temp.join("");
}
console.log(solution("1924",2)); // 94
5가지의 문제를 풀어보았는데, 더 많은 시간을 공부에 할당 해야할 것 같다.
알고리즘 , 자료구조에 대해 무지한 상태라 더 효율적인 방법이 있을텐데 활용할 수가 없다.
남들 너무 잘하던데,, 주눅들지 말고 열심히 살자.