개발조각

[프로그래머스] 직사각형 별찍기 본문

알고리즘🅰/프로그래머스

[프로그래머스] 직사각형 별찍기

개발조각 2022. 3. 10. 13:07
728x90
반응형

이번 문제는 프로그래머스 Level 1에 3페이지 마지막 문제라서 그런지 뭔가 코드가 좀 이상하네요.

여기서는 return으로 답을 호출해주는게 아니라 console.log()로 호출해야지 답으로 나옵니다.

 


해결방안

process.stdin.setEncoding('utf8');
process.stdin.on('data', data => {
    const n = data.split(" ");
    const a = Number(n[0]), b = Number(n[1]);
    // console.log(a);
    // console.log(b);
    // console.log(n);
    
    let star = '*'.repeat(a);
    let str = '';
    
    for(let i=0; i<b; i++){
        str+= `${star}\n`
    }
    console.log(str)
    
});

 

쉽게 설명하면

// 5 3가 입력되면 a=5; b=3; 입니다.

let star = '*'.repeat(a);
let str = '';

for(let i=0; i<b; i++){
    str+= `${star}\n`
}
return str;

 

해결방안 순서

  1. a번 만큼 "*"찍어서 가로길이 만들기
  2. a번 만킄 *을 찍은 문자열을 b번 반복해서 세로 길이 만들기

 

1단계. a번 만큼 "*"찍어서 가로길이 만들기

let star = '*'.repeat(a);

먼저 가로길이를 만들어 주었습니다.

예전이었으면 for문을 돌렸겠지만 이제는 내장 함수를 쓰면 쉽게 해결된다는 걸 알기 때문에😆

내장 함수를 사용해주었습니다.

 

이때 사용한 내장 함수는 repeat()메소드를 사용해주었습니다.

MDN Web Docs
String.prototype.repeat()
repeat() 메서드는 문자열을 주어진 횟수만큼 반복해 붙인 새로운 문자열을 반환합니다.

구문 : str.repeat(count);

  • count : 문자열을 반복할 횟수. 0과 양의 무한대 사이의 정수([0, +∞)).
// repeat()메서드 예제
'abc'.repeat(-1);   // RangeError
'abc'.repeat(0);    // ''
'abc'.repeat(1);    // 'abc'
'abc'.repeat(2);    // 'abcabc'
'abc'.repeat(3.5);  // 'abcabcabc'
'abc'.repeat(1/0);  // RangeError

({ toString: () => 'abc', repeat: String.prototype.repeat }).repeat(2);
// 'abcabc'

 

테스트 1 (a=5; b=3)
let star = '*'.repeat(a); -> '*****'

테스트 2 (a=2; b=2)
let star = '*'.repeat(a); -> '**'

 

2단계. a번 만킄 *을 찍은 문자열을 b번 반복해서 세로길이 만들기

for(let i=0; i<b; i++){
    str+= `${star}\n`
}

세로 길이를 만들기 위해 for문을 썼습니다.

for문에서 1단계에서 만든 star을 b번만큼 반복해 주어서 str빈 문자열에 이어 붙여줬습니다.

 

여기서 그냥 이어 붙여주면 일열로 쭉 붙여지게 돼서

문자열 star 엔터를 같이 써주어야 됩니다.

 

코드에서 엔터를 넣는 방법은 두 가지가 있습니다.

  1. \n
  2. 템플릿 리터럴에서 엔터 넣기
// 1번
\n

// 2번
`
`

코드로 쓰면 이렇게 됩니다.

 

여기서 템플릿 리터럴에 대해 설명하자면

템플릿 리터럴 ("template strings" (템플릿 문자열))

  • ES6부터 새로 도입된 문자열 표기법입니다.
  • 문자열 생성 시 따옴표 대신, 백틱(`)을 사용합니다.
  • ${ } 사이에 변수나 연산 등을 삽입할 수 있습니다.

이렇습니다.

 

저는 코드를 짤 때 템플릿 리터럴로 쓰기 편해서 템플릿 리터럴로 썼고요. 엔터 표시는 보기 편하게 \n을 넣어주었습니다.

테스트 1 (a=5; b=3)
let star = '*'.repeat(a); -> '*****'
for(let i=0; i<b; i++) -> 0, 1, 2 (3번 반복)
i=0
str+= `${star}\n`
str =
'*****

'
i=1
str+= `${star}\n`
str =
'*****
*****
'

i=1
str+= `${star}\n`
str =
'*****
*****
*****
'

테스트 2 (a=2; b=2)
let star = '*'.repeat(a); -> '**'
for(let i=0; i<b; i++) -> 0, 1 (2번 반복)
i=0
str+= `${star}\n`
str =
'**
'
i=1
str+= `${star}\n`
str =
'**
**
'

 


여기까지 프로그래머스 직사각형 별찍기 해결방안에 대해 설명해보았습니다.

728x90
반응형
Comments