#AIL_23.12.15 // Programmers_직사각형 별찍기
## 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에 할당합니다. 이렇게 하면 변수 n과 m에는 각각 가로와 세로의 길이가 저장됩니다.
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의 첫 번째와 두 번째 요소를 숫자로 변환하여 변수 a와 b에 할당합니다. 입력이 문자열로 들어오지만, 우리는 이를 숫자로 사용하려고 합니다.
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에서는 동작하지 않음