안녕하세요
[node.js] 백준 반복문 단계 (자바스크립트) 2739 ~ 본문
클론코딩을 하면서 부족한 자바스크립트 문법은 백준을 통해서 공부합시다.
초보입니다. 코드 설명은 "참고만" 해주세요.
https://www.acmicpc.net/step/3
2739 구구단
아래와 같이 N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오.
2
결과
2 * 1 = 2
2 * 2 = 4
2 * 3 = 6
2 * 4 = 8
2 * 5 = 10
2 * 6 = 12
2 * 7 = 14
2 * 8 = 16
2 * 9 = 18
자바스크립트 for 반복문
(https://developer.mozilla.org/ko/docs/Web/JavaScript/Guide/Loops_and_iteration)
var step;
for (step = 0; step < 5; step++) {
// Runs 5 times, with values of step 0 through 4.
console.log('Walking east one step');
}
제출한 답1
const inputCase = require("fs").readFileSync('/dev/stdin')
const number = Number(inputCase)
for ( step = 1; step < 10; step++) {
console.log(`${number} * ${step} = ${number * step}`)
}
- 위의 자바스크립트 for 반복문을 이용합니다.
- require('fs') : file system 모듈을 불러옵니다.
- .readFileSync('/dev/stdin') : 데이터가 저장된 위치에 접근하여 내용을 읽어옵니다.
- Number(inputCase) : inputCase를 number로 변환합니다.
- `${}` : ` ` 백틱 안에서 ${ } 괄호 안에 변수를 넣으면 문자열과 혼합하여 출력할 수 있습니다.
제출한 답2 - 출력 형식이 잘못되었습니다
const inputCase = require("fs").readFileSync('/dev/stdin').map(Number)
for ( step = 1; step < 10; step++) {
console.log(`${inputCase} * ${step} = ${inputCase * step}`)
}
- 출력 결과가 어떻게 다른지 알 수 없습니다. 동일하게 출력 결과가 나타나지만 정답으로 인식이 되지 않았습니다.
10950 A+B - 3
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오. 첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)
5
1 1
2 3
3 4
9 8
5 2
결과
2
5
7
17
7
제출한 답
const inputData = require('fs').readFileSync('/dev/stdin').toString().split('\n')
for ( step = 1; step <= inputData[0]; step++){
let [a, b] = inputData[step].split(' ').map(Number)
console.log(`${a+b}`)
}
- inputData[0] : inputData[0]은 입력받은 테스트케이스의 숫자 5 입니다.
- let [a, b] = inputData[step] : step = 1 일때는 [1, 1]을 입력받고 step = 2 일때는 [2, 3]을 입력받습니다.
8393 합
아래와 같이 입력을 받고 1부터 n까지 합을 출력합니다.
3
결과
6
제출한 답
const inputNumber = require('fs').readFileSync('/dev/stdin')
let result = 0
for ( step=1; step <= inputNumber; step++){
result += step
}
console.log(result)
- for 문을 통해 1부터 inputNumber 까지 더해주었습니다.
15552 빠른 A+B
아래와 같이 첫번째 줄에 테스트케이스 개수와 이후의 줄부터는 합해야 할 숫자 두 개씩을 입력받습니다.
5
1 1
12 34
5 500
40 60
1000 1000
결과
2
46
505
100
2000
제출한 답
const inputData = require('fs').readFileSync('/dev/stdin').toString().split('\n')
let result = ''
for ( step = 1; step <= inputData[0]; step++){
const [a, b] = inputData[step].split(' ').map(Number)
result += `${a+b}\n`
}
console.log(result)
- console.log로 한 줄씩 출력하면 시간이 많이 걸립니다. 따라서 하나의 문자열로 출력하면 됩니다.
- result += `${a+b}\n` : "문자열" + "문자열" = "문자열문자열"
2741 N 찍기
자연수 N을 아래와 같이 입력받고 첫째 줄부터 N번째 줄 까지 차례대로 출력하시오
5
결과
1
2
3
4
5
제출한 답
const inputNumber = require('fs').readFileSync('/dev/stdin')
result = ''
for (step=1; step <= inputNumber; step++) {
result += step+"\n"
}
console.log(result)
- 15552 의 문제와 마찬가지로 시간 제한이 1초 이므로 결과를 한 번에 출력시켜주었습니다.
2742 기찍 N
아래와 같이 입력을 받고첫째 줄부터 N번째 줄 까지 차례대로 출력합니다.
5
결과
5
4
3
2
1
제출한 답
inputNumber = Number(inputNumber);
let result = "";
for (step = inputNumber; step >= 1; step--) {
result += step + "\n";
}
console.log(result);
- step-- : step은 inputNumber에서 시작하여 0이 될 때까지 1씩 줄어들며 명령문을 반복합니다
11021 A+B - 7
첫째 줄에 테스트 케이스의 개수 T를, 각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어집니다.
5
1 1
2 3
3 4
9 8
5 2
아래와 같이 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력합니다.
Case #1: 2
Case #2: 5
Case #3: 7
Case #4: 17
Case #5: 7
제출한 답
let inputData = require("fs").readFileSync("dev/stdin").toString().split("\n");
let result = "";
for (step = 1; step <= inputData[0]; step++) {
let [a, b] = inputData[step].split(" ").map(Number);
result += `Case #${step}: ${a + b}\n`;
}
console.log(result);
- 위의 문제들과 다른 특별한 점은 없었습니다.
11022 A+B - 8
아래와 같이 첫 줄에 테스트 케이스 T를 받고 이후로 두 정수 A와 B를 입력받습니다.
5
1 1
2 3
3 4
9 8
5 2
아래와 같이 출력하면 됩니다.
Case #1: 1 + 1 = 2
Case #2: 2 + 3 = 5
Case #3: 3 + 4 = 7
Case #4: 9 + 8 = 17
Case #5: 5 + 2 = 7
제출한 답
const inputData = require('fs').readFileSync('dev/stdin').toString().split('\n')
let result = "";
for (step = 1; step <= inputData[0]; step++) {
const [a, b] = inputData[step].toString().split(" ").map(Number);
result += `Case #${step}: ${a} + ${b} = ${a + b}\n`;
}
console.log(result);
- 위의 문제들과 다른 특별한 점은 없었습니다.
2438 별 찍기 - 1
아래와 같이 숫자 N을 입력받습니다.
5
아래와 같이 출력합니다.
*
**
***
****
*****
제출한 답
const inputNumber = require('fs').readFileSync('dev/stdin')
for (step = 1; step <= inputNumber; step++) {
console.log("*".repeat(step));
}
- .repeat(step) : 자바스크립트에서는 문자열을 *로 곱하는 것이 안됩니다. repeat를 활용해 문자열 곱하기와 동일한 결과를 출력할 수 있습니다.
2439 별 찍기 - 2
N을 아래와 같이 입력받고 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.
5
결과
*
**
***
****
*****
제출한 답
const inputNumber = require('fs').readFileSync("dev/stdin")
for (step = 1; step <= inputNumber; step++) {
let blank = " ".repeat(inputNumber - step);
let star = "*".repeat(step);
console.log(blank + star);
}
- 2438 문제와 비슷합니다. 공백의 수와 별의 수의 합은 inputNumber가 됩니다.
10871 X보다 작은 수
아래와 같이 첫째 줄에 N과 X가 주어집니다. 둘째 줄에 수열 A를 이루는 정수 N개가 주어집니다.
10 5
1 10 4 9 2 3 8 5 7 6
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력합니다. X보다 작은 수는 적어도 하나 존재합니다.
1 4 2 3
제출한 답1
const [nAndX,numberArrangement] = require('fs').readFileSync("dev/stdin").toString().split('\n')
- .filter((number) : filter 함수를 통해서 smallerThanThisNumber 보다 작은 수를 걸러내어 리스트에 저장합니다.
- result += filtering[step] + " "; : 리스트에 저장된 인자들을 순서대로 result 변수에 문자열로 더합니다.
제출한 답2 - for 반복문을 사용하지 않고
const [nAndX,numberArrangement] = require('fs').readFileSync("dev/stdin").toString().split('\n')
- .join(" ") : filter() 함수를 통해 출력한 값([ '1', '4', '2', '3' ])을 join 함수로 " " 공백을 추가해 동일한 결과를 출력합니다.
10952 A+B - 5
아래와 같이 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
1 1
2 3
3 4
9 8
5 2
0 0
결과
2
5
7
17
7
제출한 답
const inputData = require("fs").readFileSync("dev/stdin").toString().trim().split("\n");
for (i = 0; i < inputData.length - 1; i++) {
let [a, b] = inputData[i].toString().split(" ").map(Number);
console.log(a + b);
}
- inputData.length - 1 : 0 0 을 입력받으면 종료되므로 while 문에서 종료 조건을 의도한 것 같지만 반복 횟수를 -1 로 지정해도 같은 결과가 나왔습니다.
1110 더하기 사이클
0보다 크거나 같고, 99보다 작거나 같은 정수입니다.
주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수(01)로 만듭니다.
각 자리의 숫자를 더합니다.
주어진 수의 가장 오른쪽 자리 수와 구한 합의 가장 오른쪽 자리 수를 이어 붙입니다.
26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.
위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.
N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.
26
결과
4
제출한 답 - 문자열의 위치로 값을 구하기 : 시간 초과
let input = require("fs").readFileSync("dev/stdin").toString();
if (input.length == 1) { // 입력받은 숫자가 10보다 작은 수라면 앞에 0을 붙입니다 ( example. 1 => 01 )
input = "0" + input;
}
let start = input;
let count = 0;
while (true) {
let plus = (Number(start[0]) + Number(start[1])).toString(); // 26부터 시작한다. 2+6 = 8
let num = start[1] + plus[plus.length - 1]; // "6" + "8"
start = num; // 새로운 수는 68이다. > 시작숫자 = 새로운 수 로 돌아가 반복합니다.
count += 1; // 사이클을 1 더합니다.
if (num == input) { // (새로운 수 == 입력받은 숫자) 라면 반복을 멈춥니다.
break;
}
}
console.log(count);
- 조건대로 문자열끼리 붙여 식을 만들었습니다. 문자열은 수식보다 연산이 오래 걸리는가 봅니다. 시간 초과입니다.
제출한 답 2 - 수식
const input = Number(require("fs").readFileSync("dev/stdin").toString());
let count = 0;
let startNumber = input;
while (true) {
count++;
let plusNum = (Math.floor(startNumber / 10) + (startNumber % 10)) % 10;
let newNum = String(startNumber % 10) + String(plusNum);
startNumber = newNum;
if (startNumber == input) {
console.log(count);
break;
}
}
- 위와 동일한 방식으로 풀어 나가지만, 이를 문자열이 아닌 수식으로 바꾸었습니다.
- let plusNum = (Math.floor(startNumber / 10) + (startNumber % 10)) % 10;
각 자리의 숫자를 더한 결과를 구합니다. - let newNum = String(startNumber % 10) + String(plusNum);
새로운 숫자를 구합니다. - startNumber = newNum;
새로운 숫자를 구하는 수식에 넣기 위해서 변수를 새로운 값으로 바꿉니다.
'백준 자바스크립트' 카테고리의 다른 글
[node.js] 문자열 단계 (자바스크립트) 11654 ~ (0) | 2022.05.10 |
---|---|
[node.js] 함수 단계 (자바스크립트) 4673 ~ (0) | 2022.05.08 |
[node.js] 백준 1차원 배열 단계 (자바스크립트) 10818 ~ (0) | 2022.05.05 |
[node.js] 백준 조건문 단계 (자바스크립트) 1330 ~ (0) | 2022.05.03 |
[node.js] 백준 입출력과 사칙연산 단계 (자바스크립트) 2557 ~ (0) | 2022.04.30 |