ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #AIL_23.12.15 // Programmers_직사각형 별찍기
    AIL( Algorithm I Learned) 2023. 12. 15. 22:46

    ## AIL_직사각형 별찍기

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

    *** 제한 조건
    n과 m은 각각 1000 이하인 자연수입니다.


    *** 예시
    입력
    5 3
    출력
    ***** ***** *****

    ## solution.JavaScript

    1. 문제의 접근 방식

    주어진 문제는 반복문을 사용하여 주어진 가로(n)와 세로(m)에 맞는 직사각형 형태의 별찍기를 구현하는 문제입니다. 


    2. 문제풀이

    process.stdin.setEncoding('utf8');
    process.stdin.on('data', data => {
        const [n, m] = data.trim().split(" ").map(Number);
    
        for (let i = 0; i < m; i++) {
            let row = '';
            for (let j = 0; j < n; j++) {
                row += '*';
            }
            console.log(row);
        }
    });
    /*
    테스트 1
    입력값 〉	"5 3"
    기댓값 〉	"*****
    *****
    *****
    "
    실행 결과 〉	테스트를 통과하였습니다.
    출력 〉	*****
    *****
    *****
    테스트 2
    입력값 〉	"2 2"
    기댓값 〉	"**
    **
    "
    실행 결과 〉	테스트를 통과하였습니다.
    출력 〉	**
    **
    */

     

    1. `process.stdin.setEncoding('utf8');` 입력값의 인코딩을 UTF-8로 설정합니다. 이는 한글 등의 다양한 문자를 올바르게 처리하기 위한 것입니다.

    process.stdin.setEncoding('utf8');

     

    2. `process.stdin.on('data', data => {` 표준 입력에서 데이터를 받을 때마다 실행되는 이벤트 핸들러를 정의합니다. 이벤트는 표준 입력에서 데이터가 들어올 때 발생합니다.

    process.stdin.on('data', data => {

     

    3. `const [n, m] = data.trim().split(" ").map(Number);` 입력값에서 공백을 기준으로 나눠 배열을 생성하고, 각 배열 요소를 숫자로 변환합니다. 이때, trim() 메서드를 사용하여 앞뒤 공백을 제거합니다. 그리고 배열의 첫 번째 요소를 n, 두 번째 요소를 m에 할당합니다. 이렇게 하면 변수 nm에는 각각 가로와 세로의 길이가 저장됩니다.

       const [n, m] = data.trim().split(" ").map(Number);

     

    4. `for (let i = 0; i < m; i++) {` 세로(m) 횟수만큼 반복하는 외부 반복문입니다. 각각의 반복은 출력할 별이 들어갈 행을 나타냅니다.

       for (let i = 0; i < m; i++) {

     

    5. `let row = '';` 각 행에 출력될 문자열을 담을 변수 row를 초기화합니다.

     let row = '';

     

    6. `for (let j = 0; j < n; j++) {` 가로(n) 횟수만큼 반복하는 내부 반복문입니다. 각각의 반복은 한 행에 들어갈 별을 나타냅니다.

     for (let j = 0; j < n; j++) {

     

    7.   `row += '*';` 각 행에 별을 하나씩 추가합니다.

        row += '*';

     

    8. `console.log(row);` 내부 반복문이 종료되면 해당 행의 문자열을 출력합니다.

     console.log(row);

     

    9. 외부 반복문이 종료될 때까지 위 과정을 반복하면서 전체 직사각형을 출력합니다.


    3. 다른사람의 문제풀이 및 접근방식 분석_2중 repeat() 사용 

    process.stdin.setEncoding('utf8');
    process.stdin.on('data', data => {
        const n = data.split(" ");
        const a = Number(n[0]), b = Number(n[1]);
        console.log((('*').repeat(a)+`\n`).repeat(b))
    });
    /*
    테스트 1
    입력값 〉	"5 3"
    기댓값 〉	"*****
    *****
    *****
    "
    실행 결과 〉	테스트를 통과하였습니다.
    출력 〉	*****
    *****
    *****
    테스트 2
    입력값 〉	"2 2"
    기댓값 〉	"**
    **
    "
    실행 결과 〉	테스트를 통과하였습니다.
    출력 〉	**
    **
    */

     

    1. 표준 입력의 인코딩을 UTF-8로 설정하는 부분입니다. UTF-8은 다양한 문자를 표현할 수 있는 문자 인코딩 방식 중 하나입니다.

    process.stdin.setEncoding('utf8');

     

    2. 표준 입력에서 데이터 이벤트가 발생할 때마다 실행되는 콜백 함수를 정의하고 있습니다.

    process.stdin.on('data', data => {
      // ...
    });

     

    3. 입력으로 들어온 데이터를 공백을 기준으로 나누어 배열로 만드는 부분입니다. 예를 들어, "5 3"이라는 입력이 들어오면 배열 n["5", "3"]이 됩니다.

    const n = data.split(" ");

     

    4. 배열 n의 첫 번째와 두 번째 요소를 숫자로 변환하여 변수 ab에 할당합니다. 입력이 문자열로 들어오지만, 우리는 이를 숫자로 사용하려고 합니다.

    const a = Number(n[0]), b = Number(n[1]);

     

    5.  ('*').repeat(a)은 별을 a번 반복하는 문자열을 생성하고, 이를 개행 문자(\n)과 함께 b번 반복하여 출력합니다. 여기서 repeat 메서드는 문자열을 여러 번 반복하는데 사용됩니다.

    console.log((('*').repeat(a) + `\n`).repeat(b));

    #  repeat() 메서드란?

    repeat() 메소드는 문자열을 주어진 횟수만큼 반복하여 새로운 문자열을 생성합니다. 이 메소드는 ES6에서 도입되었으며, 기존에는 반복문이나 다른 방법을 사용하여 문자열을 반복해야 했던 불편함을 해소해 주는 기능을 제공합니다.


    #  repeat() 사용방법

    const originalString = 'Hello';
    const repeatedString = originalString.repeat(3);
    
    console.log(repeatedString);
    // 출력: 'HelloHelloHello'

    #  repeat() 장단점

    ** 장점

    1. 간결하고 가독성이 좋음

    repeat()를 사용하면 반복 작업을 간결하게 표현할 수 있어 코드의 가독성이 향상됩니다.

    const repeatedString = 'abc'.repeat(3);
    // 출력: 'abcabcabc'

    2. 코드 유지보수 용이

    반복 로직이 명시적이며, 나중에 반복 횟수를 수정할 때 코드를 변경하기 쉽습니다.

    const repeatCount = 5;
    const repeatedString = 'abc'.repeat(repeatCount);

    3. 패턴 생성 용이

    특정 패턴을 만들거나 특정 문자열을 반복해서 생성할 때 효과적입니다.

     

    ** 단점

    1. 메모리 사용량 증가 가능

     큰 반복 횟수의 경우 메모리 사용량이 증가할 수 있습니다. 매우 큰 문자열을 생성해야 하는 경우에는 주의가 필요합니다.

    const largeString = 'abc'.repeat(1e6); // 메모리 사용량 증가

    2. 음수 및 Infinity 사용 불가

     repeat()의 인수로 음수 또는 Infinity를 사용할 수 없습니다.

    'abc'.repeat(-1); // 에러 발생
    'abc'.repeat(Infinity); // 에러 발생

    3. IE에서 제한적 지원

    repeat() 메소드는 IE에서 제한적으로 지원되므로, 특히 IE를 대상으로 하는 프로젝트에서는 폴리필이나 대체 방법을 고려해야 합니다.


    #  repeat() 사용시기

    1. 문자열 반복

    특정 문자열을 반복해서 생성해야 할 때 사용합니다.

    const repeatedString = 'abc'.repeat(3);
    // 출력: 'abcabcabc'

    2. 패턴 생성

     특정 패턴이나 문자열을 반복해서 만들 때 유용합니다.

    const pattern = '*'.repeat(5);
    // 출력: '*****'

    3. 가독성 향상이 필요한 경우

    코드를 더 간결하게 만들거나 반복 로직을 명확하게 표현하고자 할 때 사용합니다.

    const repeatCount = 4;
    const repeatedString = 'abc'.repeat(repeatCount);
    // 출력: 'abcabcabcabc'

    repeat() 메소드는 주로 문자열을 반복하는 간단한 작업에서 사용되며, 특히 코드의 가독성을 향상시키고자 할 때 유용합니다. 그러나 메모리 사용량이나 브라우저 호환성 등을 고려하여 적절히 활용하는 것이 중요합니다.


    #  repeat() 사용시 주의사항

    1. 음수 또는 Infinity 사용하지 않기

    repeat()의 인수는 음수 또는 Infinity일 수 없습니다. 이러한 경우에는 에러가 발생합니다.

    'abc'.repeat(-1); // 에러 발생
    'abc'.repeat(Infinity); // 에러 발생

    2. 반올림

     반복 횟수가 소수일 경우 소수점 아래를 반올림하여 처리합니다.

    'abc'.repeat(2.9); // 'abcabc'

    3. 메모리 사용 주의

     큰 반복 횟수의 경우 메모리 사용에 유의해야 합니다.

    'abc'.repeat(1e6); // 큰 문자열 생성, 메모리 사용에 주의

    4. IE 지원

    repeat() 메소드는 IE에서 제한적으로 지원되므로 사용 환경을 고려해야 합니다. (IE에서 사용하지 않거나 폴리필을 사용하는 방법이 있습니다.)

    'abc'.repeat(3); // IE에서는 동작하지 않음

     

Designed by Tistory.