[백준] 별찍기 1-8 문제풀이 - JS

Algorithm/BackJun 2023. 7. 13.
반응형

  목 차

  • 별찍기 1
  • 별찍기 2
  • 별찍기 3
  • 별찍기 4
  • 별찍기 5
  • 별찍기 6
  • 별찍기 7
  • 별찍기 8

 


 

 

  별찍기 1

 

Goal

N번 째 줄에는 N개의 별이 찍혀야 한다.

*
**
***
****
*****

 

 

Design

그저 반복문을 통해 별이 추가되는 식으로 설계를 하고 구현을 해보았다.

const input = 5;

let result = '';

for(let i = 0; i < input ; i++) {
    result += '*';
    console.log(result);
};

 

 


  별찍기 2

 

Goal

별찍기 1과 같이 N 번째 줄에는 N개의 별을 찍는다. 하지만 이번엔 오른쪽 정렬을 한다.

    *
   **
  ***
 ****
*****

 

 

Design

바깥 for문은 줄을 바꾸는 반복문, 안쪽 for문에서는 별을 찍는 역할을 하는데,

'조건에 맞으면 공백을, 아니면 별을 찍어라' 라는 의미의 for문이다.

const input = 5;

for(i = 0; i < input; i ++) {
    let result = '';
    for(j = 0; j < input; j++) {
        if(j < input-(i+1)) {
            result += ' ';
        } else {
            result += '*';
        };
    };
    console.log(result);
}

 

 


  별찍기 3

 

Goal

첫 번째 줄에는 별이 N개, 줄이 내려갈수록 -1 이 된다.

*****
****
***
**
*

 

 

Design

바깥 for문은 그대로 줄을 바꾸는 역할, 안쪽 for문은 별을 찍는 역할을 한다.

⚠️별을 찍고 나면 그 뒤에는 공백이 없다. 그러므로 아무 처리도 하지 않고 조건에 맞게 별만 찍게 한다.

아래 코드는 공백을 출력하게 했다가 없앤 코드이다.

const input = 5;

for(let i = 0; i <= input - 1 ; i ++) {
    let result = '';
    for(let j = 0; j <= input - 1; j++) {
        if(j >= input - i ) {

        } else {
            result += '*';
        };
    };
    console.log(result);
}

 

 


  별찍기 4

 

Goal

별찍기 3번과 같지만, 오른쪽 정렬을 한다.

*****
 ****
  ***
   **
    *

 

 

Design

내용은 위와 똑같으므로 생략

const input = 5;

for(let i = 0; i < input ; i ++) {
    let result = '';
    for(let j = 0; j < input; j++) {
        if(j < i) {
            result += ' ';
        } else {
            result += '*';
        };
    };
    console.log(result);
}

 

 


  별찍기 5 ✨

 

Goal

첫 번째 줄에는 1개, 두 번째 줄에는 3개, N 번째 줄에는 2*N-1개를 찍어야한다.

단, 가운대를 기준으로 대칭이어야 한다.

    *
   ***
  *****
 *******
*********

 

 

Design

⚠️별 뒤에는 공백이 없다.

이 문제에서는 초보개발자의 생각의 틀을 깰 수 있는 좋은 문제라고 생각한다.

문제의 함정'2*N-1개'에 있다고 생각한다. 따지고 보면 2*N-1을 활용해서 풀 수 있다.

하지만 여기서 틀을 깨고싶은건, '조건문이 동적일 수 있다.'는 것이다.

 

아래 코드를 보면 바깥 for문은 똑같다. 하지만 여기서 주목할 점은 안쪽 for문이다.

조건식이 j < input + i 인데, 위 예시를 보면 공백을 N - (i + 1) 개 만큼 찍어내고, 별을 찍어낸다는 것을 알 수 있다.

그리고 별을 찍어내는 개수는 조건식에서 조절을 하는 것이다.

줄이 바뀔 때마다 i는 1씩 늘어나니, 별도 하나씩 늘어나고, 공백의 개수도 하나씩 줄어드니 결국에는 삼각형 모양이 되는 것이다.  

const input = 5;  // test용

for(i = 0; i < input; i ++) {
  let result = '';
  for(j = 0; j < input + i; j++) {
    if(j < input - (i + 1)) {
        result += ' ';
      } else {
        result += '*';
    };
  };
  console.log(result);
}

 

 


  별찍기 6

 

Goal

별씩기 5와 같지만, 이번에는 첫 번째 줄에는 2*N-1개, 두 번째 줄에는 2*N-3개를 찍고 마지막은 1개를 찍는다.

별은 가운데를 중심으로 대칭이어야 한다.

*********
 *******
  *****
   ***
    *

 

 

Design

조건식만 달라지고 나머진 똑같다.

const input = 5;

for(let i = 0; i < input ; i ++) {
    let result = '';
    for(let j = 0; j < input * 2 - 1; j++) {
        if(j < i){
            result += ' ';
        }else if(j < input * 2 - 1 - i){
            result += '*';
        }
    };
    console.log(result);
}

 

 


  별찍기 7

⛔️이 문제는 문제가 있다. 

Number를 추가해주어야 한다. String 형식으로 들어와 5+0=5가 아닌 5+0=50이 되어 오답이 나온다.

const input = Number(require('fs').readFileSync('/dev/stdin').toString().trim());

 

Goal

별로 다이아몬드를 만들어라

    *
   ***
  *****
 *******
*********
 *******
  *****
   ***
    *

 

 

Design

별찍기 5와 별찍기 6을 합친 것이 별찍기 7이라고 볼 수 있다.

먼저 나는 위쪽 별을 찍는 for문과 아래쪽 별을 찍는 for문을 나누었는다.

조건식만 이해하면 알 수 있다고 생각한다.

for(let i = 0; i < input * 2 - 1; i++) {
  let result = '';
  if(i < input){  
    for(let j = 0; j < input + i; j++) {
        if(j < input - (i + 1)) {
          result += ' ';
        } else {
          result += '*';
      };
    };
	};
  if(i >= input) {
    for(let k = 0; k <= input * 2 - 1; k++) {
        if(k < i - input + 1) {
            result += ' ';
        } else if(k <= 2 * (input - 1) - (i - (input-1))){ 
            result += '*';
            };
        };
    };
  console.log(result);
}

 

 


  별찍기 8

 

Goal

아래와 같이 만들어라

*        *
**      **
***    ***
****  ****
**********
****  ****
***    ***
**      **
*        *

 

 

Design

논리연산자를 이용해 중간에 공백을 찍고 나머지는 별을 찍게 하였다. 공백은 점점 줄어들고 별은 점점 많아지니, 그림과 같이 된다.

역시 가장 중요한 것은 살이 되는 조건식이다.

뼈대는 항상 같다.

for(let i = 0; i < 2 * input - 1; i++) {  
  let result = '';
    for(j = 0; j < 2 * input; j++){
      if(i < input) {
        if(j <= i) {  // i = 3
          result += '*';
        } else if(j > i && j < 2 * input - (i + 1)) { 
          result += ' ';
        } else {
          result += '*';
        };
      };
      if(i >= input){
        if(j < input - (i - input + 1)) {  
          result += '*';
        } else if (j <= i){ 
          result += ' ';
        } else {
          result += '*';
        }
      }
    }
  console.log(result);
  };
반응형