# 자바스크립트 스터디 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)
```