반복문


2739번 (구구단)

const fs = require("fs");
const input = parseInt(fs.readFileSync("/dev/stdin").toString());
for (let i = 1; i<10; i++) {
console.log(`${input} * ${i} = `+input * i);
}
  • 이번에는 input 변수 자체를 parseInt함수로 묶어주었다.
  • 반복문의 기본 문법을 이용했다.
  • 벡틱 안에서 변수를 표현하고 싶은 경우 중괄호({})안에 넣고 그 앞에 $를 붙여주면 된다.
  • 다른 방법으로는 input+” * “+i+” = “ 이런 식으로 표현하는 방법이 있다.
  • 10950번 (A+B - 3)

    const fs = require("fs");
    const input = fs.readFileSync("/dev/stdin")
    .toString().trim().replaceAll('\n', ' ').split(' ').map(x => Number(x));
    for (let i = 1; i < input[0]*2; i+=2) {
    console.log(input[i] + input[i+1]);
    }
  • 줄바꿈이 많아 replace()가 아닌 replaceAll()을 사용했다.
  • map()에 대해 더 정확히 이해하기 위해 위와 같은 방법으로도 써봤다.
  • 반복문에서 i를 1씩 증가하지 않고 더 많이 증가시키려면 위와 같이 쓰면 된다.
  • i가 2씩 증가하므로 input[0]에도 2를 곱해주었다.
  • 8393번 (합)

    const fs = require("fs");
    const input = parseInt(fs.readFileSync("/dev/stdin").toString());
    let sum = 0;
    for (let i = input; i > 0; i--) {
    sum += i;
    }
    console.log(sum);
  • sum변수를 const가 아닌 let을 이용하여 지정한 이유는 반복문을 거치며 sum변수가 변하기 때문이다.
  • i++로 1씩 증가하는 것뿐 아니라 i—로 1씩 감소하는 것도 가능하다. 그냥 해봤는데 됐다.
  • sum += i 는 sum = sum + i 와 같다.
  • 자바스크립트에서는 ‘=’을 같다는 뜻으로 이해하면 이해가 어려운 것 같다. 같다는 것 말고 ‘대입한다’라는 개념으로 이해하려고 한다.
  • 같다는 개념은 ‘==’ 또는 ‘===’ 이다.
  • 25304번 (영수증)

    const fs = require("fs");
    const input = fs.readFileSync("/dev/stdin").toString().split('\n');
    // 줄바꿈을 기준으로 배열로 잘라 입력받는다.
    const totalPrice = Number(input[0]);
    const itemNumber = Number(input[1]);
    // 총 금액과 품목의 개수는 따로 변수로 설정했다.
    let sum = 0;
    for (let i = 2; i < itemNumber+2; i++) {
    let newArr = input[i].split(' ');
    sum += newArr[0]*newArr[1];
    }
    // sum이라는 변수를 설정해두고 거기에 총 금액과 비교할 값을 집어넣었다.
    // 가격과 개수는 newArr라는 새 배열을 만들어 잘라넣을 수 있었고 이를 이용해 계산했다.
    if (sum == totalPrice) {
    console.log("Yes");
    } else {
    console.log("No");
    }
    // 총 금액과 계산한 금액이 같으면 Yes, 다르면 No를 출력하도록 하였다.
  • == 연산자는 문자형과 숫자형 자료가 있을 때 문자형을 숫자형으로 변환하여 비교한다. 따라서 10 == “10”도 맞다고 한다.
  • === 연산자는 자료형까지 비교하여 10 === “10”은 틀렸다고 한다.
  • 위에선 sum과 totalPrice 모두 숫자형 자료이다.
  • 15552번 (빠른 A+B)

    const fs = require("fs");
    const input = fs.readFileSync("/dev/stdin").toString().split('\n');
    const totalNum = parseInt(input[0]);
    let answer = '';
    for (let i = 1; i < totalNum+1; i++) {
    const newArr = input[i].split(' ').map(Number);
    answer += newArr[0] + newArr[1] + '\n';
    }
    console.log(answer);
  • 이 문제는 테스트케이스의 개수 T가 최대 1,000,000이다.
  • 이 때문에 애초에 for문 내에서 console.log를 실행한 첫번째 시도에서 시간초과가 났다.
  • 시간초과를 피하기 위해 answer라는 변수를 만들어주고 그 안에 정답을 한 줄씩 담았다(\n 이용).
  • for문 밖에서 answer를 출력해주었다.
  • 11021번 (A + B - 7)

    const fs = require("fs");
    const input = fs.readFileSync("./input.txt").toString().split('\n');
    let answer = '';
    for (let i = 1; i <= input[0]; i++) {
    let newArr = input[i].split(' ').map(Number);
    answer += `Case #${i}: ${newArr[0] + newArr[1]}\n`;
    }
    console.log(answer);
  • 이 문제는 25304번, 15552번과 매우 흡사한 문제이다.
  • 11022번 (A + B - 8)

    const fs = require("fs");
    const input = fs.readFileSync("/dev/stdin").toString().split('\n');
    let answer = '';
    for (let i = 1; i <= input[0]; i++) {
    let newArr = input[i].split(' ').map(Number);
    answer += `Case #${i}: ${newArr[0]} + ${newArr[1]} = ${newArr[0] + newArr[1]}\n`;
    }
    console.log(answer);
  • 11021번 문제에서 for문 마지막 줄만 수정했다.
  • 2438번 (별 찍기 - 1)

    const fs = require("fs");
    const input = parseInt(fs.readFileSync("/dev/stdin").toString());
    for (let i = 1; i <= input; i++) {
    console.log('*'.repeat(i));
    }
  • .repeat() 메소드를 아느냐의 문제였던 것 같다.
  • 2439번 (별 찍기 -2)

    const fs = require("fs");
    const input = parseInt(fs.readFileSync("./input.txt").toString());
    for (let i = 1; i <= input; i++) {
    console.log(' '.repeat(input-i) + '*'.repeat(i));
    }
  • input값을 활용하여 해결했다.
  • 10871번 (X보다 작은 수)

    const fs = require("fs");
    const input = fs.readFileSync("/dev/stdin").toString().split('\n');
    const arr1 = input[0].split(' ').map(Number);
    const arr2 = input[1].split(' ').map(Number);
    let answer = '';
    for (let i = 0; i < arr1[0]; i++) {
    if (arr2[i] < arr1[1]) {
    answer += arr2[i].toString() + " ";
    }
    }
    console.log(answer);
  • 요소가 2개인 배열로 받아 요소들을 또 각자 배열로 쪼갰다.
  • for문 안에 if문을 넣어 만약 X보다 작다면 answer에 넣도록 하였다.
  • 10952번 (A + B - 5)

    const fs = require("fs");
    const input = fs.readFileSync("dev/stdin").toString().trim().split('\n');
    const count = input.length -1;
    for (let i = 0; i < count; i++) {
    const arr = input[i].split(' ').map(Number);
    console.log(arr[0]+arr[1]);
    }
  • 이 문제는 처음에 .trim()을 하지 않은 채로 제출 했더니 틀렸다고 나왔다.
  • 코드는 잘 짠 것 같은데 틀렸다고 나올때는 .trim()으로 깔끔한 인풋을 받았는지 확인해야 할 것 같다.
  • input 배열의 길이를 알아내기 위해 input.length를 사용했고 마지막에는 ‘0 0’이 들어오니 -1을 해줬다.
  • while문을 사용해서 0 0이 들어오면 루프를 종료하는 방법도 가능하다.
  • 10951번 (A + B - 4)

    const fs = require("fs");
    const input = fs.readFileSync("./input.txt").toString().trim().split('\n');
    const count = input.length;
    for (let i = 0; i < count; i++) {
    const arr = input[i].split(' ').map(Number);
    console.log(arr[0]+arr[1]);
    }
  • 10952번 문제에서 .length 뒤 -1만 빼주었다.
  • 1110번 (더하기 사이클)

    const fs = require("fs");
    let input = parseInt(fs.readFileSync("/dev/stdin").toString());
    // input이 한자리인 경우 곱하기 10을 해주기 때문에 여기서는 input을 let으로 선언하였음.
    let answer = 0;
    if (input < 10 && input != 0) {
    input = input * 10;
    } else if (input === 0) {
    answer++;
    }
    // input이 한자리인 경우 if문을 통해 10을 곱해줌.
    // 그러나 예제에서 0의 경우 1을 출력하기 때문에 0이면 여기서 answer변수에 +1을 해주었음.
    let oneNum = input % 10;
    let tenNum = (input - oneNum) / 10;
    let newNum = 0;
    // 1의 자리와 10의 자리를 표현해 주고 newNum이라는 변수를 선언해줌.
    while (newNum != input) {
    newNum = ((oneNum + tenNum) % 10) + (oneNum * 10);
    oneNum = newNum % 10;
    tenNum = (newNum - oneNum) / 10;
    answer++;
    }
    // input이 0인 경우 newNum과 input이 같기 때문에 while문이 작동하지 않음.
    // newNum이 input과 같아질 때까지 루프가 돌게 됨.
    // 루프 안에서는 문제의 내용대로 계속해서 새로운 newNum을 만들어냄.
    // 루프가 한번 돌때마다 answer는 1씩 증가함.
    // 마침내 newNum과 input이 같아지면 루프가 종료됨.
    console.log(answer);
  • 반복문의 마지막 문제이고 난이도는 브론즈1이다.
  • 그래도 구글링하지 않고 내 힘으로 작성한 코드로 성공했다! 고민하는 과정도 재밌었고 결국 정답을 맞췄을 때도 뿌듯했다.