-
#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에 할당합니다. 이렇게 하면 변수 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에서는 동작하지 않음
'AIL( Algorithm I Learned)' 카테고리의 다른 글
#AIL_23.12.19 // Programmers_이상한 문자 만들기** (0) 2023.12.19 #AIL_23.12.17 // Programmers_최대공약수와 최소공배수***** (1) 2023.12.17 #AIL_23.12.13 // Programmers_행렬의 덧셈*** (0) 2023.12.13 #AIL_23.12.12 // Programmers_문자열 다루기 기본 (0) 2023.12.12 #AIL_23.12.11 // Programmers_문자열 내림차순으로 배치하기 (1) 2023.12.11