기본적인 알고리즘

const score = [40,13,89,52,7];
//순위를 저장할 빈 배열을 준비한다
//빈 배열에는 모두 1을 저장한다.
//점수를 저장한 배열에서 요소들끼리 비교하여, 작으면 1을 더해야 한다

function getRank(arr){
  const rank =[];
  for(let i = 0; i < arr.length ; i++){
    rank.push(1); //이게 더 확장성 있는 코드이다.
    for(let j = 0; j < arr.length ; j++){
      if(arr[i] < arr[j]){
        rank[i]++;
      }
    }
  }
  return rank;
}

console.log(getRank(score));
class clock{
  constructor(hour,min,second){
    this.hour = hour;
    this.min = min;
    this.second = second;
  }
}

const time1 = new clock(6,32,12);
const time2 = new clock(7,10,52);

//time1과 time2의 대소 비교
function compareTime(time1,time2){
  let t1 = time1.hour * 60 * 60 + time1.min * 60 + time1.second;
  let t2 = time2.hour * 60 * 60 + time2.min * 60 + time2.second;
  let bigtime = Math.max(t1,t2);
  if(bigtime === t1){
    return `더 큰 시각은 ${time1.hour}시 ${time1.min}분 ${time1.second}초 입니다.`
  }else{
    return `더 큰 시각은 ${time2.hour}시 ${time2.min}분 ${time2.second}초 입니다.`
  }
}

//초 단위로 환산한다
//뺄셈을 하여 절댓값을 구한다
//3600으로 나누고, 몫을 정수 처리하여 hour 변수에 저장
//3600으로 나눈 나머지를 60으로 나누고, 몫을 정수 처리하여 min변수에 저장
//이때 나머지는 sec변수에 저장한다.
function getTimeDiff(time1,time2){
  let t1 = time1.hour * 60 * 60 + time1.min * 60 + time1.second;
  let t2 = time2.hour * 60 * 60 + time2.min * 60 + time2.second;
  let secTimeDiff = Math.abs(t1 - t2);
  let h = Math.floor(secTimeDiff / 3600);
  let hremain = secTimeDiff % 3600 ;
  let m = Math.floor(hremain / 60);
  let s = hremain % 60;
  return `두 시간의 차이는 ${h}시간 ${m}분 ${s}초 입니다.`;
}
console.log(getTimeDiff(time1,time2));

0 이상의 모든 정수에 대해서, 인자를 대소 구분없이 넣어도 되는 함수이다.

//원리: X를 Y (X>=Y)로 나누었을 때 나머지를 R이라고 한다면, 
//X와 Y의 최대공약수는 Y와 R의 최대공약수와 같다.
//나누기 과정을 반복하여, 나머지가 0이 될 경우, 최대공약수는 X로 한다.

function getGCD(num1,num2){
  if(num1 === num2){
    return num1; //early return
  }
  let big = Math.max(num1,num2);
  let small = Math.min(num1,num2); //큰 수와 작은 수를 정한다

  if(small === 0){
    return `최대공약수를 구하려면 두 수 모두 0이 아닌 정수여야 합니다`;
  }else{
    let remain = big % small;
    while(remain !==0){
      big = small;
      small = remain;
      remain = big % small; //이 코드는 예시 숫자를 이용하여 변수가 어디에 할당되는지를 생각해보고 짜면 된다.
    }
    return small;
  }
}

원리 설명은 여기

//배열에서 가장 길이가 긴 숫자를 구한다. 그것만큼 총 반복을 해야 한다
 //0-9까지 인덱스가 매겨진 버킷 배열을 준비한다
 //1의 자리 숫자에 대해 정렬할 경우)
 //배열의 각 요소에 대해서 1의 자리 숫자를 구한다
 //배열을 순회하면서 해당하는 버킷 배열에 push한다.
 //정렬된 배열을 업데이트한다: 버킷을 전개연산자로 풀어주어서 넣는다.

//가장 길이가 긴 숫자구하기
function getMaxlen(arr){
  let maxlen = 0;
  for(let i = 0 ; i < arr.length ; i++){
    if(maxlen <= arr[i].toString().length){
      maxlen = arr[i].toString().length;
    }
  }
  return maxlen;
}

//각 자리의 숫자구하기
function getDeciNum(num,dig){
  return Math.floor(num / Math.pow(10,dig)) % 10
}

function bucketSort(arr){
  for(let i = 0; i < getMaxlen(arr); i++){
    const bucket = Array.from({length: 10}, () => []) //좌측 매개변수는 반복가능한 객체(배열) 전달가능. mdn참조
    for(let j = 0; j < arr.length; j++){
      bucket[getDeciNum(arr[j],i)].push(arr[j]);
    }
    arr = [].concat(...bucket);
  }
  return arr;
}

console.log(bucketSort(arr));
const nums =[35,80,21,54,11,45,92,39];

function simplePick(arr){
  //주어진 배열에서 최소값을 찾는다
  //최솟값을 0번째 요소와 교환한다
  //...
  //남은 비정렬된 부분에서 최소값을 찾는다
  //최소값을 (arr.length - 1)번째 요소와 교환한다
  for(let i = 0 ; i < arr.length ; i++){
    let mini = Math.min(...arr.slice(i)); //아래 변수값 교환에 쓰면 안됨.arr요소가 아니기때문
    let j = arr.indexOf(mini);
    [arr[j],arr[i]] = [arr[i],arr[j]]; //구조분해 할당으로 변수를 간단히 교환!
  }
  return arr;
}

console.log(simplePick(nums));