[백준] 별찍기 1-8 문제풀이 - JS
목 차
- 별찍기 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);
};
'Algorithm > BackJun' 카테고리의 다른 글
[백준] 1654: 랜선 자르기 - JS (이분 탐색) (0) | 2023.09.05 |
---|---|
[백준] 2805: 나무 자르기 - JS (이분 탐색) (0) | 2023.09.03 |
[백준] 1920: 수 찾기 - JS (이분 탐색) (0) | 2023.09.02 |
[백준] 4673: 셀프 넘버 - JS (브루트포스) (0) | 2023.08.05 |
[백준] 2748: 피보나치 수 2 - JS (재귀, DP) (0) | 2023.07.30 |