[BAEKJOON] 2439번 ⭐️별찍기

2439번 ⭐️별찍기

문제

2439번 별찍기-2

첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

출력 예시 : 5
    *
   **
  ***
 ****
*****

풀이

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString(); 

let baekInput = Number(input);
let stars = ""; // 공백과 별을 받을 변수 선언

for (let i = 0; i < baekInput; i++) {
  for (let j = baekInput - 1; j > i; j--) {
    stars += " "; // 먼저 공백부터 채워주기
  }
  for (let k = 0; k <= i; k++) {
    stars += "*"; // 남은 별 채워주기
  }
  stars += "\n"; // 줄 바꿈
}
console.log(stars);

이번에는 별을 오른쪽부터 쌓이도록 출력해야하는 문제였다. 별을 왼쪽부터 자연스럽게 출력하는 문제와의 차이점은 중간에 공백을 넣어야한다는 점이었다.
첫 줄에는 공백*4, 별*1 이며 두번째 줄에는 공백*3. 별*2 의 형식이다.

그렇기 때문에 동기적인 JavaScript 의 성격을 고려해서 for문 안에서 2개의 for문 이 돌아가도록 했다. 같은 변수 stars 에 공백과 별을 집어 넣고 마지막에 console.log(stars) 을 통해 출력할 생각이었다.

위의 코드로 실행을 하면 결과값은 맞게 잘 나온다. 하지만, 이중 for문 에 심지어 for문 을 두 개나 돌린 것이 마음에 걸렸다.

같은 스터디를 진행하고 있는 동기분들(무현님😎, 현재님✨, 동희님🌼, 영현님🧑🏻‍💻)과 이야기를 나눠보고 같은 문제에 대해서 코드를 공유해보니 좋은 방법이 있었다.

console.log() 를 사용할 때 공백 변수와 별 변수를 + 연산자를 통해서 더하면 됐다. 그렇게 하면 2중for문 으로 작성할 수 있다.

const fs = require("fs");
const input = fs.readFileSync("./dev/stdin").toString(); 

let baekInput = Number(input);

let star = '';
let blank = '';

for(i = 1; i <= baekInput; i++){
    star += '*'; // 별 채우기
    for(j = baekInput; j > i; j-- ){
        blank += ' '; // 공백 채우기
    }
    console.log(blank + star);
    blank = ''; // 출력 후에 초기화를 안하면 공백이 계속 쌓인다!
}

짜잔!!✨ 동일한 결과가 잘 나오는 것을 볼 수 있다. 찝찝한 마음을 남겨뒀던 코드가 훨씬 나아진 것 같아서 마음에 든다. 앞으로는 정답을 출력하는 것도 중요하지만 누가봐도 이해하기 좋은 코드를 작성할 수 있도록 고민도 더 해보려고 한다.

좋은 웹페이지 즐겨찾기