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));