배꼽파지 않도록 잘 개발해요

코드잇 javaScript 기초 - 프로그래밍과 데이터 in JavaScript ④ 과제로 복습하기 본문

코드잇 Codeit/Front-End

코드잇 javaScript 기초 - 프로그래밍과 데이터 in JavaScript ④ 과제로 복습하기

꼽파 2023. 5. 5. 15:27


  • 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()로 사용하기!
    728x90