AIL( Algorithm I Learned)

#AIL_23.12.15 // Programmers_직사각형 별찍기

k0z 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에서는 동작하지 않음