1. 팩토리얼
2. 거스름돈 구하기
3. 팰린드롬
1. 팩토리얼
result의 초기값인 1부터 시작해서 n까지 반복하는 for문
function factorial(n) {
let result = 1;
for ( i = 1; i <= n; i++ ) {
result = result * i
}
return result;
}
// 테스트 코드
console.log(factorial(12)); // 479001600
console.log(factorial(6)); // 720
console.log(factorial(3)); // 6
console.log(factorial(0)); // 1
파라미터로 받는 수인 n부터 시작해서 1까지 반복하는 for문
function factorial(n) {
let result = 1;
for (let i = n; i >= 1; i--) {
result = result * i;
}
return result;
}
// 테스트 코드
console.log(factorial(12)); // 479001600
console.log(factorial(6)); // 720
console.log(factorial(3)); // 6
console.log(factorial(0)); // 1
2. 거스름돈 구하기
있는 그대로 작성한 코드
function calculateChange(payment, cost) {
let money = payment - cost;
let result = "";
if ( money >= 50000 ) {
let m1 = Math.floor( money / 50000 );
money = money - 50000 * m1;
result += `50000원 지폐: ${m1}장\n`;
} else {
result += `50000원 지폐: 0장\n`;
}
if ( money >= 10000 ) {
let m2 = Math.floor( money / 10000 );
money = money - 10000 * m2;
result += `10000원 지폐: ${m2}장\n`;
} else {
result += `10000원 지폐: 0장\n`;
}
if ( money >= 5000 ) {
let m3 = Math.floor( money / 5000 );
money = money - 5000 * m3;
result += `5000원 지폐: ${m3}장\n`;
} else {
result += `5000원 지폐: 0장\n`;
}
if ( money >= 1000 ) {
let m4 = Math.floor( money / 1000 );
money = money - 1000 * m4;
result += `1000원 지폐: ${m4}장`;
} else {
result += `1000원 지폐: 0장\n`;
}
return result;
}
// 테스트 코드
console.log(calculateChange(100000, 33000));
console.log("");
console.log(calculateChange(500000, 378000));
결과는 똑같이 나오지만 반복되는 부분이 많아서 수정할 필요가 있음
똑같이 시행되는 부분을 함수로 만들고, 지폐 금액은 파라미터로 넣어서 실행하면 될 듯 싶음.
함수를 사용해서 매우 간단하게 만든 코드
function calculateChange(payment, cost) {
// change는 거스름돈 총액
const change = payment - cost;
// bill은 화폐 -> 5만, 1만, 5천, 1천원 -> 파라미터
// count는 지폐의 개수
function Calculator(bill) {
const count = Math.floor(change / bill) // Math.floor을 이용해서 지폐 개수 구하기
change = change - bill * count // 변화된 거스름돈 총액을 재할당 (거스름돈 총액 - 지폐금액 x 지폐개수)
return count; // count 값을 반환
}
console.log(`50000원 지폐: ${Calculator(50000)}장`)
console.log(`10000원 지폐: ${Calculator(10000)}장`)
console.log(`5000원 지폐: ${Calculator(5000)}장`)
console.log(`1000원 지폐: ${Calculator(1000)}장`)
}
// 테스트 코드
console.log(calculateChange(100000, 33000));
console.log("");
console.log(calculateChange(500000, 378000));
주의할 점은 함수가 먼저 실행되는게 아니고 console.log 구문에서 함수를 매번 호출
→ change값을 계산할 때마다 바꿔줘야됨 (5만원, 1만원, 5천원, 1천원 순서대로 계산되므로)
count값을 반환해주는 구문이 있어야 함.
코드잇 모범답안
function calculateChange(payment, cost) {
// 여기에 코드를 작성하세요
let change = payment - cost; // 거스름돈 총액
function billCounting(amount) {
const count = Math.floor(change / amount);
change = change - amount * count;
return count;
}
// 지폐금액에 맞는 변수를 생성해줌
const fiftyCount = billCounting(50000);
const tenCount = billCounting(10000);
const fiveCount = billCounting(5000);
const oneCount = billCounting(1000);
console.log(`50000원 지폐: ${fiftyCount}장`);
console.log(`10000원 지폐: ${tenCount}장`);
console.log(`5000원 지폐: ${fiveCount}장`);
console.log(`1000원 지폐: ${oneCount}장`);
}
calculateChange(100000, 33000);
console.log('');
calculateChange(500000, 378000);
다 똑같은데 이 코드는 지폐 금액에 맞는 변수를 생성해서 그걸 console.log 구문에 넣어줌.
배열을 활용하기
function calculateChange(payment, cost) {
let change = payment - cost; // 거스름돈 총액
function billCounting(amount) {
const count = Math.floor(change / amount);
change = change - amount * count;
return count;
}
const bills = [ 50000, 10000, 5000, 1000 ];
for ( bill of bills ) {
const count = billCounting(bill)
console.log(`${bill}원 지폐: ${count}장`)
}
}
calculateChange(100000, 33000);
console.log('');
calculateChange(500000, 378000);
/*
주의할 점 :
billingCount에 사용된 count변수와
for of문의 count 변수는 서로 다른 것임!
for문에서 count변수를 선언해줘야 됨.
*/
지폐 금액을 배열을 활용하여 할당하도록 함.
for of문을 활용하였음.
※ 참고 : for in문과 for of문
const ARR = ['A', 'B', 'C'];
// for...in
for (let i in ARR) {
console.log(i); // 0, 1, 2
}
// ARR 배열 원소의 인덱스 값을 반환
// for...of
for (let i of ARR) {
console.log(i); // A, B, C
}
// ARR 배열의 원소 값을 반환
3. 팰린드롬
모범답안
/*
회문 : 원래 글자 = 뒤집은 글자
ex. 다시합창합시다
1) 글자를 배열로 만들어
2) 글자 길이 전부 다 반복할 필요 없음
- 글자 길이 짝수/홀수
- 홀수일 수도 있으니 글자 길이 절반
a b c b a 면 글자 길이 5의 절반인 2.5에서 소수점 날리고 2만
-> Math.floor()사용
*/
// 인덱스는 0부터 시작해서 word.length - 1까지 있음
function isPalindrome(word) {
for ( let i = 0; i <= Math.floor(word.length / 2); i++ ) {
const left = word[i] // 문자의 i번 인덱스
const right = word[word.length - 1 - i] // 문자의 i번의 대칭 인덱스
if ( left !== right ) {
return false;
}
}
return true;
}
console.log(isPalindrome("racecar"));
console.log(isPalindrome("stars"));
console.log(isPalindrome("기러기"));
console.log(isPalindrome("123321"));
console.log(isPalindrome("hello"));
console.log(isPalindrome("kayak"));
글자를 배열로 만들어 한 글자씩 비교하는 코드
function isPalindrome(word) {
const arr = word.split("");
const upsidedown = arr.slice().reverse();
for ( let i = 0; i < arr.length; i++ ) {
if ( arr[i] !== upsidedown[i] ) {
return false;
break;
}
}
return true;
}
console.log(isPalindrome("racecar"));
console.log(isPalindrome("stars"));
console.log(isPalindrome("기러기"));
console.log(isPalindrome("123321"));
console.log(isPalindrome("hello"));
console.log(isPalindrome("kayak"));
배열과 뒤집은 배열의 글자를 for 반복문을 이용해서 순서대로 비교
→ 한 글자만 틀리면 그냥 false를 출력하고 끝냄.
→ 모든 글자가 똑같으면 for 반복문을 마치고 true를 반환함.
기본적으로 두 배열의 모든 글자를 비교해야하기 때문에 첫 번째 코드보다 훨씬 비효율적이다.
내가 문자열도 인덱스로 접근할 수 있다는 것을 까먹어서 이렇게 짬.
매우 간단하지만 입력 단어 길이가 길어지면 비효율적인 코드
function isPalindrome(word) {
const arr = word.split("");
const reversed = arr.slice().reverse();
return arr.join("") === reversed.join("");
}
// 테스트 코드
console.log(isPalindrome("racecar"));
console.log(isPalindrome("stars"));
console.log(isPalindrome("기러기"));
console.log(isPalindrome("123321"));
console.log(isPalindrome("hello"));
console.log(isPalindrome("kayak"));
코드 길이는 매우 짧지만 비효율의 끝판왕이다.
※ 참고 : 참조형(배열, 객체) 복사할 때 주의할 것
word = "SALAD"
const arr = word.split("");
console.log(arr);
// ['S', 'A', 'L', 'A', 'D']
const reversed1 = arr.reverse();
console.log(reversed1);
// ['D', 'A', 'L', 'A', 'S']
console.log(arr);
// ['D', 'A', 'L', 'A', 'S']
// ★★ 주의 : 배열은 참조형으로 할당되므로
// 복사할 때는 꼭 slice()로 사용하기!