ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1. javascript 기초 - for문/if문 사용해서 문제풀기
    Javascript 2022. 1. 3. 17:13
    1번문제
    Q. 마스크 공장
    마스크를 담을 수 있는 팩이 3개입/5개입 2종류가 있다.
    최대한 적은 팩을 사용하여 마스크를 담으려고 한다.
    예를들어 18개의 마스크가 있다면 3개입 팩 6개를 사용 할 수 있지만,
    5개입 3개와 3개입 1개로 담으면 더 적은 팩으로 담을 수 있다.

    N개의 마스크를 담기 위해서 필요한 최소한의 팩의 수를 구하는 프로그램을 작성하라.
    단, 정확하게 팩을 만들 수 없다면 -1을 리턴해야한다.

    ex)
    18  👉   4
    4   👉   -1
    6   👉   2

     

    A.

    <script>
            function solution(n) {
                let result = 0;
                let five = 0;
                let three = 0;
    
                for (let i=parseInt(n/5); i>=0; i--) {
                    if ((n-(5*i))%3 == 0) {
                        five = i;
                        three = (n-(5*i))/3;
                        result = five + three;
                        break;
                    }
                    else {
                        result = -1;
                    }
                }
    
                return result;
            }
    
            console.log(solution(41));
    </script>

     

    접근 방법.

    가장 적은 팩을 사용하기 위해서는 가장 많은 5개입 팩을 사용해야 한다.

    따라서 5개입 팩을 최대로 사용 가능한 갯수를 i의 초기값으로 두고

    해당 개수에서 5개입에 담은 나머지가 3으로 나누어 떨어지는 지를 확인하여

    나누어 떨어진다면 👉  break로 계산을 종료하고 그 시점에서의 5개입/3개입 팩의 수를 더하여 리턴한다.

    나누어 떨어지지 않는다면 👉  i값을 하나 낮춰 다시 반복한다.

    ex1) N = 19
    초기 i 값 : 19이하의 최대의 5의 배수 = 5 * 3, i = 3
    19 = 15 + 4
    4%3 == 0 : false
    else문으로 이동하여
    result = -1 이 되고

    다시 for문의 시작으로 이동.
    i--가 되어 i = 2
    19 = 10 + 9
    9%3 == 0 : true
    if 문 내의 코드블럭 실행됨 : 5개입 팩의 수 = 2, 3개입 팩의 수 = 3, result = 2 + 3 = 5 연산 후 break

     

    ex2) N = 7
    초기 i 값 :  7이하의 최대의 5의 배수 = 5*1, i = 1
    7 = 5 + 2
    2%3 == 0 : false
    result = -1

    i--하여 i=0
    7 = 0 + 7
    7%3 == 0 : false
    result = -1

    i-- 하여 i=-1
    for문의 조건( i >= 0 )에 맞지 않으므로 for문은 실행되지 않고 
    현재의 result 값을 리턴하여
    -1이 출력

     

    ❗️나눗셈의 몫을 구하기 위해 parseInt()를 사용

    parseInt()의 정확한 설명은

    "함수는 문자열 인자를 파싱하여 특정 진수(수의 진법 체계에서 기준이 되는 값)의 정수를 반환합니다."

    라고 하는데 잘은 모르겠고 그냥 '자바스크립트 나눗셈 몫 구하는 법'이라고 검색하면 이게 나왔다.

    근데 원래 사용용도는 문자열을 정수로 바꾸는? 용도인거같다. 2진법, 16진법  등등의 수를 정수로 반환해준다.

    parseInt('100', 2) 이렇게 하면 앞의 수를 2진법으로 보고 그 값인 정수 4를 반환해준다.

     

    다른 인자 없이 실수만 입력하면 소수점 뒤를 버린 정수를 반환해준다.

    parseInt(2.7) = 2

    parseint(-0.4) = -0 (-0이라고 콘솔에 출력 되는데 -0 == 0, -0 === 0 모두 참으로 나와서 -표기는 크게 신경 안써도 되는 것 같다.)

    parseint(-2.7) = -2

    이런 식으로.

     

     

     

     

     

     


     

    2번문제(프로그래머스)
    Q. 직사각형 별찍기

    이 문제에는 표준 입력으로 두 개의 정수 n과 m이 주어집니다.
    별(*) 문자를 이용해 가로의 길이가 n, 세로의 길이가 m인 직사각형 형태를 출력해보세요.

     

    A.

    process.stdin.setEncoding('utf8');
    process.stdin.on('data', data => {
        const n = data.split(" ");
        const a = Number(n[0]), b = Number(n[1]);
        //입력받은 두 수를 a와 b에 저장하는 코드. 입력창에 디폴트로 있음
        
        
        //기존에 있던 a와 b를 console.log 하는 코드 두 줄을 지우고 여기에 작성하면 됨.
        let result = []; //문자열의 초기값. 빈 array를 만들어 둠.
    
        for (let j=0; j<b; j++) {
            for(let i=0; i<a; i++) {
                result += "*";
            }
            result += "\n"
        }
    
        console.log(result);
    })

    입력받은 두 수 a와 b만큼 도는 for문을 작성하여

    a만큼 *을 추가하고 b만큼 줄바꿈(\n)을 추가하는 방식으로 문자열을 작성한 뒤 출력.

     

     

    다른 사람의 풀이.

    process.stdin.setEncoding('utf8');
    process.stdin.on('data', data => {
        const n = data.split(" ");
        const a = Number(n[0]), b = Number(n[1]);
        
        let row = "*".repeat(n)+"\n";
        console.log(row.repeat(m))
        }
    
    });

    for문 대신 repeat이라는 메소드를 사용하여 매우 간단하게 코드를 작성하였다. 

    ( ) 안의 값만큼 앞의 문자열을 반복하는 메소드이다.

    let str = "HB"
    console.log(str.repeat(3))
    
    //결과 : HBHBHB

    문제를 풀고 다른 사람의 풀이를 보니까 아직 모르는 게 너무 많은데 여러가지 메소드를 배울 수 있어서 좋았다. 

     

     

     

    'Javascript' 카테고리의 다른 글

    6. To do list 만들기  (0) 2022.01.12
    5. javascript - 객체의 복사  (0) 2022.01.10
    4. javascript - html DOM 조작  (0) 2022.01.10
    3. javascript 기초 - forEach, 배열중복제거  (0) 2022.01.06
    2. javascript 기초 - array와 object  (0) 2022.01.04
Designed by Tistory.