안녕하세요

[node.js] 백준 반복문 단계 (자바스크립트) 2739 ~ 본문

백준 자바스크립트

[node.js] 백준 반복문 단계 (자바스크립트) 2739 ~

sakuraop 2022. 5. 4. 01:20

클론코딩을 하면서 부족한 자바스크립트 문법은 백준을 통해서 공부합시다.

초보입니다. 코드 설명은 "참고만" 해주세요.

https://www.acmicpc.net/step/3

 

반복문 단계

1부터 N까지의 합을 구하는 문제. 물론 반복문 없이 풀 수도 있습니다.

www.acmicpc.net


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

제출한 답

let inputNumber = require("fs").readFileSync("dev/stdin");
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')

const [numberCount, smallerThanThisNumber] = nAndX.split(" ").map(Number);
const numbers = numberArrangement.toString().split(" ");

let filtering = numbers.filter((number) => number < smallerThanThisNumber);
let result = "";

for (step = 0; step < filtering.length; step++) {
  result += filtering[step] + " ";
}

console.log(result);
 
  • .filter((number) : filter 함수를 통해서 smallerThanThisNumber 보다 작은 수를 걸러내어 리스트에 저장합니다.
  • result += filtering[step] + " "; : 리스트에 저장된 인자들을 순서대로 result 변수에 문자열로 더합니다.

제출한 답2 - for 반복문을 사용하지 않고

const [nAndX,numberArrangement] = require('fs').readFileSync("dev/stdin").toString().split('\n')

const [numberCount, smallerThanThisNumber] = nAndX.split(" ").map(Number);
const numbers = numberArrangement.toString().split(" ");

let filtering = numbers.filter((number) => number < smallerThanThisNumber);

console.log(filtering.join(" "));
 
  • .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;
    새로운 숫자를 구하는 수식에 넣기 위해서 변수를 새로운 값으로 바꿉니다.