# 자바스크립트 스터디 5일차 ## 문제1. ```javascript= // 인사하기 함수 function greet(){ console.log("안녕 내 이름은 제시카야") } // 매개변수 넣기 function greet(name){ console.log('안녕 내 이름은'+name+'(이)야') } // name값 리턴 function greet(name){ console.log('안녕 내 이름은'+name+'(이)야') return name; } ``` ## 문제2. ```javascript= function meetAt(y,m,d){ let year = y let month = m let date = d if(d!=null){ // 모든 값 다 잘 받아오면 return `${year}/${month}/${date}`; }else if(m!=null){ // 년, 월 값만 받아올 경우 return `${year}년 ${month}월`; }else{ // 년 return `${year}년`; } } console.log(meetAt(2024,1,4)) ``` ## 문제3. ```javascript= // 최소 숫자 찾기 함수 function findSmallestElement(arr) { // 배열 가져와서 오름차순 정렬 const sortedArr = arr.slice().sort((a,b)=>a-b); return sortedArr[0]||0; // 인덱스 첫번째 값 리턴 // 자바스크립트에서는 하나라도 truty한 값이면 그 값을 선택하고 // 둘다 'falsy'한 경우에만 두번 째 피연산자를 선택 // '0'은 falsy한 값으로 간주 // 배열이 비어 있는 경우 0이 선택되므로 둘다 falsy => 0 리턴 } let arr = [23,4,62,13,96] let result = findSmallestElementSort(arr); console.log(result) // 4 ``` ```javascript // 선택 정렬 Select Sort // 배열을 순회하면서 가장 작은 값을 찾아 해당 위치로 옮기는 정렬 방식 // ex) [1,4,2,3] [1,4,3,2] // 1번째 결과 : [1,4,2,3] [1,4,3,2] // 2번째 결과 : [1,2,4,3] [1,2,3,4] // 3번째 결과 : [1,2,3,4] [1,2,3,4] let arr = [1,4,2,3] function SelectionSort(arr) { for (let i = 0; i < arr.length - 1; i++) { let minIndex = i; // arr[i]를 최솟값으로 가정 for (let j = i + 1; j < arr.length; j++) { if (arr[j] < arr[minIndex]) { minIndex = j; } } [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]; } return arr; } let result = SelectionSort(arr); console.log(result[0]) // 1 ``` ```javascript // 버블 정렬 Bubble Sort // 인접한 두 수를 비교하여 큰 값을 뒤로 보내면서 정렬하는 방식 // ex) [4,3,2,1] // 1번째 결과 : [3,4,2,1] [3,2,4,1] [3,2,1,4] // 2번째 결과 : [2,3,1,4] [2,1,3,4] // 3번째 결과 : [1,2,3,4] let arr = [4,3,2,1] function BubbleSort(arr) { for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; } let result = BubbleSort(arr); console.log(result[0]) // 1 ``` ```javascript // 퀵정렬 Quick Sort // 대량의 데이터에서 빠르게 정렬할 수 있음. // pivot값이 최악으로 걸리면 엄청 오래 걸림 // ex) [78,23,13,98,62,4,39,84] // [23,13,62,4] [78] [98,84] // [13,4] [23] [62] [78] [84] [98] // [4] [13] [23] [62] [78] [84] [98] let arr = [78,23,13,98,62,4,96] function quickSort(arr) { if (arr.length <= 1) { return arr; //배열의 길이가 1이되면 arr리턴 } const pivot = arr[0]; // 기준값 설정 const left = []; // 기준값 보다 작은 수 배열에 넣기 const right = []; // 기준값 보다 큰 수 배열에 넣기 for (let i = 1; i < arr.length; i++) { // 기준값과 크기 비교하여 작으면 left, 크면 right에 넣음 arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i]); } //기준값은 가운데, //left의 길이가 1이 아니면 한번더 quickSort함수 실행 //right도 마찬가지 //left와 right의 길이가 1이 될때까지 계속해서 반복 실행하여 최종 연결 return quickSort(left).concat(pivot, quickSort(right)); } let result = quickSort(arr); console.log(result[0]) // 4 ``` ```javascript // 머지정렬 Merge Sort // [3,9,2,7,4,6,0,5,1,8] 쪼개다보면 // [3][9] [2][7,4] [6][0] [5][1,8] // [7][4] [1][8] // [3][9] [2][4,7] [6][0] [5][1,8] // [3,9][2,4,7] [0,6][1,5,8] // [2,3,4,7,9] [0,1,5,6,8] // [0,1,2,3,4,5,6,7,8,9] function mergeSort(arr) { if (arr.length <= 1) { return arr; } //나누는 작업 const mid = Math.floor(arr.length / 2); const left = arr.slice(0, mid); const right = arr.slice(mid); //단일 인자가 나올때까지 나눔 return merge(mergeSort(left), mergeSort(right)); } // 나누어진 배열 병합하기 function merge(left, right) { let result = []; let leftIndex = 0; let rightIndex = 0; while (leftIndex < left.length && rightIndex < right.length) { // 작은 수를 찾아서 result에 push if (left[leftIndex] < right[rightIndex]) { result.push(left[leftIndex]); leftIndex++; } else { result.push(right[rightIndex]); rightIndex++; } } // 결국 result에 작은 숫자 순으로 정렬 // 마지막 한개의 숫자가 정렬이 안되는데 slice함수 사용해서 마저 붙임 return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex)); } let result = mergeSort(arr); console.log(result[0]) // 0 ``` ```javascript // 힙정렬 Hip Sort // 이해를 못해서 고뇌 중입니다... ``` ## 문제4. ```javascript= // 아래 코드 더 줄여보기 function Exchange(m){ const Money = [50000, 10000, 5000, 1000, 500, 100]; const result = Money.map(Money => { // Map() 새로운배열 생성 const count = Math.floor(m / Money); // 갯수 세기 m %= Money; // 잔돈 Money로 업데이트 return `${Money}원 x ${count}`; }); console.log(result.join('\n')); // 줄바꿈 구분자, 문자열 결합 후 반환 } // 화폐 교환 함수 function MoneyExchange(m){ let a = Math.floor(m/50000) // 5만원권 개수 let b = Math.floor((m%50000)/10000) // 1만원권 개수 let c = Math.floor((m%10000)/5000) // 5천원권 개수 let d = Math.floor((m%5000)/1000) // 1천원권 개수 let e = Math.floor((m%1000)/500) // 500원 개수 let f = Math.floor((m%500)/100) //100원 개수 console.log( '50,000 x ' + a + '\n' + '10,000 x ' + b + '\n' + '5,000 x ' + c + '\n' + '1,000 x ' + d + '\n' + '500 x ' + e + '\n' + '100 x ' + f ); } MoneyExchange(233700) Exchange(233700) ```