티스토리 뷰

1. 구구단

https://www.acmicpc.net/problem/2739

문제

구구단

문제
N을 입력받은 뒤, 구구단 N단을 출력하는 프로그램을 작성하시오. 출력 형식에 맞춰서 출력하면 된다.

입력
첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 9보다 작거나 같다.

출력
출력형식과 같게 N*1부터 N*9까지 출력한다.

예제 입력 1
2

예제 출력 1
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

해답

const fs = require("fs");

const inputData = +fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

for (let i = 1; i < 10; i++) {
  console.log(`${inputData} * ${i} = ${inputData * i}`);
}

풀이

inputData

파일 읽어오기
readFileSync()
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 32>

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

실수 형식으로 변환
+
const inputData = +fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // 2

Buffer 형식으로 출력된 값을 inputData로 정의하려는 식 앞에 +를 붙여 실수 형식으로 변환합니다.

구구단 구하기

for (let i = 1; i < 10; i++) {
  console.log(`${inputData} * ${i} = ${inputData * i}`);
}
for
for (let i = 1; i < 10; i++) {}

구구단을 출력하기 위해 for 문을 활용하여 inputData으로부터 1부터 9까지 곱한 값을 구할 수 있도록 합니다.

출력하기
console.log()
for (let i = 1; i < 10; i++) {
  console.log(`${inputData} * ${i} = ${inputData * i}`);
}

// 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

console.log()Template literals을 활용해 for문의 i값마다 2 * 1 = 2와 같은 형식으로 출력할 수 있도록 합니다.

2. A+B-3

https://www.acmicpc.net/problem/10950

문제

A+B-3

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1
5
1 1
2 3
3 4
9 8
5 28

예제 출력 1
2
5
7
17
7

해답

const fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

const [count] = inputData;

for (let i = 1; i <= +count; i++) {
  const arrayOfValue = inputData[i].split(" ").map((value) => +value);
  const [a, b] = arrayOfValue;
  console.log(a + b);
}

풀이

inputData

파일 읽어오기
readFileSync()
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35 0a 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32>

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
toString()
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

배열 생성
split()
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

console.log(inputData); // [ '5', '1 1', '2 3', '3 4', '9 8', '5 2' ]

split()를 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

count

테스트 케이스의 개수
배열 구조 분해
const [count] = inputData;

console.log(count); // 5

구조 분해 할당배열 구조 분해을 통해 inputData로부터 count라는 이름의 변수로 테스트 케이스의 개수를 구합니다.

A + B 구하기

for (let i = 1; i <= +count; i++) {
  const arrayOfValue = inputData[i].split(" ").map((value) => +value);
  const [a, b] = arrayOfValue;
  console.log(a + b);
}
for
for (let i = 1; i <= +count; i++) {}

for 문을 활용합니다.

처음 테스트 케이스의 개수를 의미하는 값을 제외해야 하기 때문에 i값을 0이 아닌 1로 초기화합니다.

문자열 형식의 count+를 통해 실수 형식으로 바꿔 for문이 동작하도록 합니다.

값의 배열
arrayOfValue
for (let i = 1; i <= +count; i++) {
  const arrayOfValue = inputData[i].split(" ").map((value) => +value);
  // expexted output: [ 1, 1 ], ..., [ 5, 2 ]
}

값의 배열을 의미하는 arrayOfValue라는 변수를 만듭니다.

split() 메서드를 통해 매개변수 " " 즉 공백에 의한 배열을 생성합니다.

그 후 map() 메서드를 통해 문자열 형식인 배열 값들을 실수 형식으로 변환합니다.

배열 구조 분해
[a, b]
for (let i = 1; i <= +count; i++) {
  const arrayOfValue = inputData[i].split(" ").map((value) => +value);
  const [a, b] = arrayOfValue;

  console.log(a, b);
  // 1 1
  // 2 3
  // 3 4
  // 9 8
  // 5 2
}

구조 분해 할당배열 구조 분해을 통해 arrayOfValuea, b에 할당합니다.

a + b 출력
console.log()
for (let i = 1; i <= +count; i++) {
  const arrayOfValue = inputData[i].split(" ").map((value) => +value);
  const [a, b] = arrayOfValue;
  console.log(a + b);
  // 2
  // 5
  // 7
  // 17
  // 7
}

console.log() 메서드를 활용하여 a + b값을 i값마다 출력합니다.

3. 합

https://www.acmicpc.net/problem/8393

문제

합

문제
n이 주어졌을 때, 1부터 n까지 합을 구하는 프로그램을 작성하시오.

입력
첫째 줄에 n (1 ≤ n ≤ 10,000)이 주어진다.

출력
1부터 n까지 합을 출력한다.

예제 입력 1
3

예제 출력 1
6

해답

const fs = require("fs");

const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

let result = 0;

for (let i = 0; i <= inputData; i++) {
  result += i;
}

console.log(result);

풀이

inputData

파일 읽어오기
readFileSync()
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 33>

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

실수 형식으로 변환
+
const fs = require("fs");

const inputData = +fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // 3

Buffer 형식으로 출력된 값을 inputData로 정의하려는 식 앞에 +를 붙여 실수 형식으로 변환합니다.

result

결과값 선언 및 초기화
let result = 0;

1부터 n까지 합을 담을 변수 result를 0으로 초기화하여 선언합니다.

결과값 구하기

for
for (let i = 0; i <= inputData; i++) {}

for 문을 통해 i0으로 초기화하여 i 값을 1씩 증가시키면서 inputData까지 증가하여 inputData + 1번 반복하게끔 합니다.

모든 i 값 더하기
더하기 할당
for (let i = 0; i <= inputData; i++) {
  result += i;
}
// ex) inputData = 3
// 1 time: 0 = 0 + 0
// 2 time: 1 = 0 + 1
// 3 time: 3 = 1 + 2
// 4 time: 6 = 3 + 3

할당 연산자더하기 할당을 통해 반복문을 통해 순환되는 모든 i값을 result에 더합니다.

결과값 출력

console.log()
console.log(result);

console.log() 메서드를 통해 result값을 출력합니다.

4. 빠른 A+B

https://www.acmicpc.net/problem/15552

문제

빠른 A+B

문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.

C++을 사용하고 있고 cin/cout을 사용하고자 한다면, cin.tie(NULL)과 sync_with_stdio(false)를 둘 다 적용해 주고, endl 대신 개행문자(\n)를 쓰자. 단, 이렇게 하면 더 이상 scanf/printf/puts/getchar/putchar 등 C의 입출력 방식을 사용하면 안 된다.

Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.

또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

자세한 설명 및 다른 언어의 경우는 이 글에 설명되어 있다.

이 블로그 글에서 BOJ의 기타 여러 가지 팁을 볼 수 있다.

입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.

예제 입력 1
5
1 1
12 34
5 500
40 60
1000 1000

예제 출력 1
2
46
505
100
2000

해답

const fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim()
  .split("\n");

const count = inputData.length;

let result = "";

for (let i = 1; i < count; i++) {
  const data = inputData[i].split(" ").map((value) => +value);

  if (i < count - 1) {
    result += `${data[0] + data[1]}\n`;
  } else if (i < count) {
    result += `${data[0] + data[1]}`;
  }
}

console.log(result);

풀이

inputData

파일 읽어오기
readFileSync()
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35 0a 31 20 31 0a 31 32 20 33 34 0a 35 20 35 30 30 0a 34 30 20 36 30 0a 31 30 30 30 20 31 30 30 30>

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
toString()
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 12 34
// 5 500
// 40 60
// 1000 1000

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

문자열 공백 제거
trim()
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim();

console.log(inputData);
// 5
// 1 1
// 12 34
// 5 500
// 40 60
// 1000 1000

공백이 존재한다고 생각하진 않았는데 백준에서 재출을 할 때 틀렸다고 하였습니다. 혹시나해서 trim() 메서드를 활용하였더니 성공하였습니다.

trim() 메서드를 활용하여 문자열 양 끝의 공백을 제거합니다.

배열 생성
split()
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

console.log(inputData); // [ '5', '1 1', '12 34', '5 500', '40 60', '1000 1000' ]

split()을 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

count

배열 inputData의 길이
length
const count = inputData.length;

각 줄에 해당하는 값들을 더해야하므로 length를 통해 배열인 inputData의 길이를 구합니다.

result

결과값 선언 및 초기화
let result = "";

각 줄에 해당하는 값들을 담은 변수 result""문자열 형식의 빈 값으로 초기화하여 선언합니다.

결과값 구하기

for (let i = 1; i < count; i++) {
  const data = inputData[i].split(" ").map((value) => +value);

  if (i < count - 1) {
    result += `${data[0] + data[1]}\n`;
  } else if (i < count) {
    result += `${data[0] + data[1]}`;
  }
}
for
for (let i = 1; i <= count; i++) {}

for 문을 통해 첫 줄은 테스트케이스의 개수르르 의미하므로 0이 아닌 i1으로 초기화하여 i 값을 1씩 증가시키면서 count까지 증가하여 for문의 수행횟수를 count번 반복하게끔 합니다.

각 줄의 값 배열화 (data)
for (let i = 1; i < count; i++) {
  const data = inputData[i].split(" ").map((value) => +value);
}
// expected output :
// [ '1', '1' ]
// [ '12', '34' ]
// [ '5', '500' ]
// [ '40', '60' ]
// [ '1000', '1000' ]
split()

각 줄의 번호를 의미하는 inputData[i]로부터 태스트 케이스 값들을 받아 공백을 의미하는 매개변수 " "이 포함된 split() 메서드를 실행하여 각 줄에 값들에 대한 각각의 배열을 만듭니다.

map()

그 후 (value) => +value가 포함된 callback 함수를 가지는 map() 메서드를 통해 문자열 형식을 실수 형식으로 바꾸게 하여 연산이 가능하도록 합니다.

if...else
if (i < count - 1) {
  result += `${data[0] + data[1]}\n`;
} else if (i < count) {
  result += `${data[0] + data[1]}`;
}

if...else을 통하여 result에 담을 값에 대한 경우를 나누어야합니다.

i < count - 1 의 경우
if (i < count - 1) {
  result += `${data[0] + data[1]}\n`;
}

count의 값이 1부터 count - 2까지의 경우 연산이 끝난 후 다음줄로 출력되어야 하기 때문에 \n을 써줍니다.

값을 더하기 할당 연산자를 활용하여 순서대로 더해줍니다.

i < count 의 경우
else if (i < count) {
  result += `${data[0] + data[1]}`;
}

else if를 통해 i < count - 1 의 경우를 제외한 i < countcount - 1에 대한 경우는 \n을 제외해 다음줄까지 함께 출력되는 것을 방지합니다.

마찬가지로 값을 더하기 할당 연산자를 활용하여 더해줍니다.

결과값 출력

console.log()
console.log(result);
// 2
// 46
// 505
// 100
// 2000

console.log() 메서드를 통해 result값을 출력합니다.

5. N 찍기

https://www.acmicpc.net/problem/2741

문제

N 찍기

문제
자연수 N이 주어졌을 때, 1부터 N까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

예제 입력 1
5

예제 출력 1
1
2
3
4
5

해답

const fs = require("fs");

const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

let result = "";

for (let i = 1; i <= inputData; i++) {
  result += `${i}\n`;
}

console.log(result);

풀이

inputData

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

숫자 형식으로 변환
const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
+

String 형식으로 출력된 값을 + 을 통해 문자열 형식에서 숫자 형식으로 바꿉니다.

result

결과값들을 담을 변수
let result = "";

결과값이 담길 변수 result을 선언하고, "" 즉 빈 값으로 초기화합니다.

for

for (let i = 1; i <= inputData; i++) {}

inputData 값이 예제에서 5이므로 1의 경우부터 5의 경우까지 반복합니다.

1부터 inputData 까지의 값을 출력해야하기 때문에

i값을 1로 선언하고 1부터 inputData까지 for문을 반복하게 합니다.

result에 i 값 줄바꿈하여 넣기
for (let i = 1; i <= inputData; i++) {
  result += `${i}\n`;
}
// expected output:
// 1
// 2
// 3
// 4
// 5
Templete literals

Templete literals를 통해 자연수인 i 값이 연산이 되지 않도록 문자열 형식이 되게 합니다.

더하기 할당

더하기 할당 연산자를 활용하여 \n을 통해 오른쪽 피연산자의 값인 i 값이 result으로 더해져도 다음줄에서 더해지게 합니다.

출력하기

console.log(result);
// 1
// 2
// 3
// 4
// 5
console.log()

console.log()를 통해 result 값을 출력합니다.

6. 기찍 N

https://www.acmicpc.net/problem/2742

문제

기찍 N

문제
자연수 N이 주어졌을 때, N부터 1까지 한 줄에 하나씩 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 100,000보다 작거나 같은 자연수 N이 주어진다.

출력
첫째 줄부터 N번째 줄 까지 차례대로 출력한다.

예제 입력 1
5

예제 출력 1
5
4
3
2
1

해답

const fs = require("fs");

const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

let result = "";

for (let i = 1; i <= inputData; i++) {
  result += `${i}\n`;
}

console.log(result);

풀이

inputData

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

숫자 형식으로 변환
const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
+

String 형식으로 출력된 값을 + 을 통해 문자열 형식에서 숫자 형식으로 바꿉니다.

result

결과값들을 담을 변수
let result = "";

결과값이 담길 변수 result을 선언하고, "" 즉 빈 값으로 초기화합니다.

for

for (let i = inputData; i >= 1; i--) {}

inputData 값이 예제에서 5이므로 5의 경우부터 1의 경우까지 반복합니다.

inputData부터 1까지의 값을 출력해야하기 때문에

i값을 inputData로 선언하고 inputData부터 1까지 for문을 반복하게 합니다.

result에 i 값 줄바꿈하여 넣기
for (let i = inputData; i >= 1; i--) {
  result += `${i}\n`;
}
// expected output:
// 5
// 4
// 3
// 2
// 1
Templete literals

Templete literals를 통해 자연수인 i 값이 연산이 되지 않도록 문자열 형식이 되게 합니다.

더하기 할당

더하기 할당 연산자를 활용하여 \n을 통해 오른쪽 피연산자의 값인 i 값이 result으로 더해져도 다음줄에서 더해지게 합니다.

출력하기

console.log(result);
// 5
// 4
// 3
// 2
// 1
console.log()

console.log()를 통해 result 값을 출력합니다.

7. A+B-7

https://www.acmicpc.net/problem/11021

문제

A+B-7

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력
각 테스트 케이스마다 "Case #x: "를 출력한 다음, A+B를 출력한다. 테스트 케이스 번호는 1부터 시작한다.

예제 입력 1
5
1 1
2 3
3 4
9 8
5 2

예제 출력 1
Case #1: 2
Case #2: 5
Case #3: 7
Case #4: 17
Case #5: 7

해답

const fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

const [count] = inputData;

for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a + b}`);
}

풀이

inputData

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35 0a 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32 0a>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

배열 생성
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

console.log(inputData); // [ '5', '1 1', '2 3', '3 4', '9 8', '5 2' ]
split()

split()을 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

count

테스트 케이스 개수
const [count] = inputData;

console.log(count); // 5
배열 구조 분해

구조 분해 할당배열 구조 분해을 활용해 inputData배열의 첫 번째 인덱스에 해당하는 값 즉 inputData[0]을 변수 count에 할당합니다.

for

for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a + b}`);
}
for (let i = 1; i <= +count; i++) {}

count 값이 예제에서 5이므로 1의 경우부터 5의 경우까지 반복합니다.

1부터 count 까지의 값을 출력해야하기 때문에

i값을 1로 선언하고 1부터 count까지 for문을 반복하게 합니다.

+count

count 값은 문자열 형식이기 때문에 +를 통해 숫자로 형식을 바꿔줍니다.

testCase
for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase);
  // [ 1, 1 ]
  // [ 2, 3 ]
  // [ 3, 4 ]
  // [ 9, 8 ]
  // [ 5, 2 ]
}
split()
const testCase = inputData[i].split(" ");

testCase내에 있는 변수들을 모두 더하는 연산을 하기 위해서 testCase 내에 있는 변수들을 모두 각각의 배열로 분해해야합니다.

split()을 활용하여 매개변수에 공백을 의미하는 " "를 넣어 배열을 만듭니다.

map()
const testCase = inputData[i].split(" ").map((value) => +value);

그 후 (value) => +value가 포함된 callback 함수를 가지는 map() 메서드를 통해 문자열 형식을 실수 형식으로 바꾸게 하여 연산이 가능하도록 합니다.

[a, b]
for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(a, b);
  // 1 1
  // 2 3
  // 3 4
  // 9 8
  // 5 2
}
배열 구조 분해
const [a, b] = testCase;

구조 분해 할당배열 구조 분해을 활용해 testCase배열의 변수들을 각각 a, b에 할당합니다.

출력하기
for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a + b}`);
  // Case #1: 2
  // Case #2: 5
  // Case #3: 7
  // Case #4: 17
  // Case #5: 7
}
Templete literals
`Case #${i}: ${a + b}`;

Templete literals을 활용해

${i}로 하여금 i값을 반복문이 실행되는 경우마다 넣도록 합니다.

그리고 ${a + b}를 통해 연산된 값을 나타내도록 합니다.

console.log()
console.log(`Case #${i}: ${a + b}`);
// Case #1: 2
// Case #2: 5
// Case #3: 7
// Case #4: 17
// Case #5: 7

console.log() 메서드를 통해 테스트 케이스마다 Templete literals 로 이루어진 값을 출력합니다.

8. A+B-8

https://www.acmicpc.net/problem/11022

문제

A+B-8

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력
각 테스트 케이스마다 "Case #x: A + B = C" 형식으로 출력한다. x는 테스트 케이스 번호이고 1부터 시작하며, C는 A+B이다.

예제 입력 1
5
1 1
2 3
3 4
9 8
5 2

예제 출력 1
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 fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

const [count] = inputData;

for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
}

풀이

inputData

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35 0a 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32 0a>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 5
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

배열 생성
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

console.log(inputData); // [ '5', '1 1', '2 3', '3 4', '9 8', '5 2' ]
split()

split()을 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

count

테스트 케이스 개수
const [count] = inputData;

console.log(count); // 5
배열 구조 분해

구조 분해 할당배열 구조 분해을 활용해 inputData배열의 첫 번째 인덱스에 해당하는 값 즉 inputData[0]을 변수 count에 할당합니다.

for

for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
}
for (let i = 1; i <= +count; i++) {}

count 값이 예제에서 5이므로 1의 경우부터 5의 경우까지 반복합니다.

1부터 count 까지의 값을 출력해야하기 때문에

i값을 1로 선언하고 1부터 count까지 for문을 반복하게 합니다.

+count

count 값은 문자열 형식이기 때문에 +를 통해 숫자로 형식을 바꿔줍니다.

testCase
for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase);
  // [ 1, 1 ]
  // [ 2, 3 ]
  // [ 3, 4 ]
  // [ 9, 8 ]
  // [ 5, 2 ]
}
split()
const testCase = inputData[i].split(" ");

testCase내에 있는 변수들을 모두 더하는 연산을 하기 위해서 testCase 내에 있는 변수들을 모두 각각의 배열로 분해해야합니다.

split()을 활용하여 매개변수에 공백을 의미하는 " "를 넣어 배열을 만듭니다.

map()
const testCase = inputData[i].split(" ").map((value) => +value);

그 후 (value) => +value가 포함된 callback 함수를 가지는 map() 메서드를 통해 문자열 형식을 실수 형식으로 바꾸게 하여 연산이 가능하도록 합니다.

[a, b]
for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(a, b);
  // 1 1
  // 2 3
  // 3 4
  // 9 8
  // 5 2
}
배열 구조 분해
const [a, b] = testCase;

구조 분해 할당배열 구조 분해을 활용해 testCase배열의 변수들을 각각 a, b에 할당합니다.

출력하기
for (let i = 1; i <= +count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
  const [a, b] = testCase;

  console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
  // 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
}
Templete literals
`Case #${i}: ${a} + ${b} = ${a + b}`;

Templete literals을 활용해

${i}로 하여금 i값을 반복문이 실행되는 경우마다 넣도록 합니다.

그리고 ${a}, ${b}를 통해 a, b의 값을 나타내게 하고 ${a + b}를 통해 연산된 값을 나타내도록 합니다.

console.log()
console.log(`Case #${i}: ${a} + ${b} = ${a + b}`);
// 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

console.log() 메서드를 통해 테스트 케이스마다 Templete literals 로 이루어진 값을 출력합니다.

9. 별 찍기 - 1

https://www.acmicpc.net/problem/2438

문제

별 찍기 - 1

문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1
5

예제 출력 1
*
**
***
****
*****

해답

const fs = require("fs");

const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = 1; y <= i; y++) {
    stars += "*";
  }

  console.log(stars);
}

풀이

inputData (입력값)

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

숫자 형식으로 변환
const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
+

문자열 형식이었던 inputData+를 붙혀 숫자 형식으로 변환합니다.

for (별이 출력되는 줄의 개수)

for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = 1; y <= i; y++) {
    stars += "*";
  }

  console.log(stars);
  // *
  // **
  // ***
  // ****
  // *****
}
for (let i = 1; i <= inputData; i++) {}

별이 출력되는 줄의 수와 관련된 for문입니다.

inputData 값이 예제에서 5이므로 1의 경우부터 5의 경우까지 반복합니다.

별을 출력되는 줄이 총 5줄이기 때문에

i값을 1로 선언하고 1부터 inputData까지 for문을 반복하게 합니다.

stars (별이 담기는 변수)
for (let i = 1; i <= inputData; i++) {
  let stars = "";
}

별이 담기는 변수 stars를 빈 값으로 선언합니다.

for문이 반복되어 stars값에 추후에 어떤 값이 들어와 새로운 값이 되어도 i값이 증가하면서 "" 빈 값으로 초기화됩니다.

for (각 줄에 담기는 별의 개수)
for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = 1; y <= i; y++) {
    stars += "*";
  }
}
for (let y = 1; y <= i; y++) {}

두번째 for문입니다.

각 줄에 출력되는 별의 개수에 대한 for문입니다.

더하기 할당
for (let y = 1; y <= i; y++) {
  stars += "*";
}

// expected output:
// y가 1일 경우 *
// y가 2일 경우 **
// y가 3일 경우 ***
// y가 4일 경우 ****
// y가 5일 경우 *****

더하기 할당을 활용합니다.

반복문 for문에 의하여 i값이 1이라면 *가 출력될 것이고 2라면 **가 출력될 것입니다.

출력하기
for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = 1; y <= i; y++) {
    stars += "*";
  }

  console.log(stars);
  // *
  // **
  // ***
  // ****
  // *****
}
console.log()
console.log(stars);
// *
// **
// ***
// ****
// *****

console.log() 메서드를 통해 stars 변수를 출력합니다.

10. 별 찍기 - 2

https://www.acmicpc.net/problem/2439

문제

별 찍기 - 2

문제
첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제

하지만, 오른쪽을 기준으로 정렬한 별(예제 참고)을 출력하시오.

입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력
첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.

예제 입력 1
5

예제 출력 1
    *
   **
  ***
 ****
*****

해답

const fs = require("fs");

const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = inputData - 1; y >= i; y--) {
    stars += " ";
  }

  for (let z = 1; z <= i; z++) {
    stars += "*";
  }

  console.log(stars);
}

풀이

inputData (입력값)

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 35>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

숫자 형식으로 변환
const inputData = +fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData); // 5
+

문자열 형식이었던 inputData+를 붙혀 숫자 형식으로 변환합니다.

for (별이 출력되는 줄의 개수)

for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = inputData - 1; y >= i; y--) {
    stars += " ";
  }

  for (let z = 1; z <= i; z++) {
    stars += "*";
  }

  console.log(stars);
}
for (let i = 1; i <= inputData; i++) {}

별이 출력되는 줄의 수와 관련된 for문입니다.

inputData 값이 예제에서 5이므로 1의 경우부터 5의 경우까지 반복합니다.

별을 출력되는 줄이 총 5줄이기 때문에

i값을 1로 선언하고 1부터 inputData까지 for문을 반복하게 합니다.

stars (별이 담기는 변수)
for (let i = 1; i <= inputData; i++) {
  let stars = "";
}

별이 담기는 변수 stars를 빈 값으로 선언합니다.

for문이 반복되어 stars값에 추후에 어떤 값이 들어와 새로운 값이 되어도 i값이 증가하면서 "" 빈 값으로 초기화됩니다.

for (각 줄에 담기는 공백의 개수)
for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = inputData - 1; y >= i; y--) {
    stars += " ";
  }
}
for (let y = inputData - 1; y >= i; y--) {}

두번째 for문입니다.

각 줄에 출력되는 공백의 개수에 대한 for문입니다.

더하기 할당
for (let y = inputData - 1; y >= i; y--) {
  stars += " ";
}

// expected output:
// y가 1일 경우 공백 4개
// y가 2일 경우 공백 3개
// y가 3일 경우 공백 2개
// y가 4일 경우 공백 1개
// y가 5일 경우 공백 0개

더하기 할당을 활용합니다.

공백의 개수는 inputData에서 1을 뺀 수이기 때문에 공백의 개수에 해당하는 변수로 y를 선언하고 inputData - 1로 초기화합니다. 그리고 반복문이 진행될때마다 하나씩 y값이 감소하게 합니다.

for (각 줄에 담기는 별의 개수)
for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = inputData - 1; y >= i; y--) {
    stars += " ";
  }

  for (let z = 1; z <= i; z++) {
    stars += "*";
  }
}
for (let z = 1; z <= i; z++) {}

세번째 for문입니다.

각 줄에 출력되는 별의 개수에 대한 for문입니다.

더하기 할당
for (let z = 1; z <= i; z++) {
  stars += "*";
}

// expected output:
// z가 1일 경우     *
// z가 2일 경우    **
// z가 3일 경우   ***
// z가 4일 경우  ****
// z가 5일 경우 *****

더하기 할당을 활용합니다.

공백을 넣은 이후의 과정이라서 반복문 for문에 의하여 i값이 1이라면 *가 출력될 것이고 2라면 **가 출력될 것입니다.

출력하기
for (let i = 1; i <= inputData; i++) {
  let stars = "";

  for (let y = inputData - 1; y >= i; y--) {
    stars += " ";
  }

  for (let z = 1; z <= i; z++) {
    stars += "*";
  }

  console.log(stars);
}
console.log()
console.log(stars);
//     *
//    **
//   ***
//  ****
// *****

console.log() 메서드를 통해 stars 변수를 출력합니다.

11. X보다 작은 수

https://www.acmicpc.net/problem/10871

문제

X보다 작은 수

문제
정수 N개로 이루어진 수열 A와 정수 X가 주어진다. 이때, A에서 X보다 작은 수를 모두 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000)

둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

출력
X보다 작은 수를 입력받은 순서대로 공백으로 구분해 출력한다. X보다 작은 수는 적어도 하나 존재한다.

예제 입력 1
10 5
1 10 4 9 2 3 8 5 7 6

예제 출력 1
1 4 2 3

해답

const fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

const nx = inputData[0].split(" ").map((value) => +value);
const [n, x] = nx;

const a = inputData[1].split(" ").map((value) => +value);

let result = "";

for (let i = 0; i < n; i++) {
  if (a[i] < x) {
    result += `${a[i]} `;
  }
}

console.log(result);

풀이

inputData (입력값)

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 31 30 20 35 0a 31 20 31 30 20 34 20 39 20 32 20 33 20 38 20 35 20 37 20 36>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 10 5
// 1 10 4 9 2 3 8 5 7 6
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

배열 생성
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .split("\n");

console.log(inputData); // [ '10 5', '1 10 4 9 2 3 8 5 7 6' ]
split()

split()을 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

nx (정수 n개, 조건 x를 가지는 배열)

const nx = inputData[0].split(" ").map((value) => +value);
nx에 대한 배열 생성
const nx = inputData[0].split(" ");

console.log(nx); // [ '10', '5' ]
split()

inputData[0]inputData의 첫 번째 배열로부터 " " 공백을 매개변수로 가지는 split() 메서드를 통해 배열을 생성합니다.

nx에 대한 배열 형식 변환
const nx = inputData[0].split(" ").map((value) => +value);

console.log(nx); // [ 10, 5 ]
map()

생성한 배열을 map() 메서드를 활용하여 callback함수 (value) => +value)를 통해 문자열이였던 형식을 숫자 형식으로 바꿔줍니다.

n, x (정수 n개, 조건 x)

const nx = inputData[0].split(" ").map((value) => +value);
const [n, x] = nx;
배열 nx를 n, x에 할당
const [n, x] = nx;

console.log(n, x); // 10, 5
배열 구조 분해

구조 분해 할당에서 배열 구조 분해를 통해 nx로부터 n, x에 값을 할당합니다.

a (n개로 이루어진 수열 a)

const a = inputData[1].split(" ").map((value) => +value);
수열 a에 대한 배열 생성
const a = inputData[1].split(" ");

console.log(a);
// [
//   '1', '10', '4',
//   '9', '2',  '3',
//   '8', '5',  '7',
//   '6'
// ]
split()

inputData[1]inputData의 두 번째 배열로부터 매개변수 " "을 포함한 split() 메서드를 통해 배열을 생성합니다.

a에 대한 배열 형식 변환
const a = inputData[1].split(" ").map((value) => +value);

console.log(a);
// [
//   1, 10, 4, 9, 2,
//   3,  8, 5, 7, 6
// ]
map()

생성한 배열을 map() 메서드를 활용하여 callback함수 (value) => +value)를 통해 문자열이였던 형식을 숫자 형식으로 바꿔줍니다.

result (x보다 작은 수를 담는 변수)

let result = "";

x보다 작은 수를 담는 변수 resultlet 명령문으로 선언하여 초기화가 가능하게끔 합니다.

for (a 수열 내 배열 각각에 대한 반복문)

for (let i = 0; i < n; i++) {
  if (a[i] < x) {
    result += `${a[i]} `;
  }
}

n 값이 예제에서 10이므로 0의 경우부터 9의 경우까지 반복합니다.

i값을 0으로 선언하고 0부터 9n까지 for문을 반복하게 합니다.

a[i]가 x 보다 작은 경우 선별
if (a[i] < x) {
  result += `${a[i]} `;
}
if...else
if (a[i] < x) {
}

수열 a[i]의 값이 x보다 작은 값들을 선별해야합니다.

if...else문을 활용해서 a[i] < x인 조건을 만족하는 값들만 다음 내부에 오는 연산을 수행하도록 합니다.

더하기 할당
if (a[i] < x) {
  result += `${a[i]} `;
}
// expected output: 1 4 2 3

더하기 할당을 활용해 if...else문을 통과한 수들을 result += `${a[i]} `를 통해 result값에 할당하도록 합니다.

결과값 출력하기

console.log(result); // 1 4 2 3
console.log()

console.log() 메서드를 통해 결과값을 출력합니다.

12. A+B-5

https://www.acmicpc.net/problem/10952

문제

A+B-5

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

입력의 마지막에는 0 두 개가 들어온다.

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1
1 1
2 3
3 4
9 8
5 2
0 0

예제 출력 1
2
5
7
17
7

해답

const fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim()
  .split("\n");

const count = inputData.length - 1;

for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase[0] + testCase[1]);
}

풀이

inputData (입력값)

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32 0a 30 20 30>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
// 0 0
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

공백 제거
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
// 0 0
trim()

trim()을 활용하여 문자열 양 끝의 공백을 제거합니다.

배열 생성
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim()
  .split("\n");

console.log(inputData); // [ '1 1', '2 3', '3 4', '9 8', '5 2', '0 0' ]
split()

split()을 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

count

const count = inputData.length - 1;

console.log(count); // 5
테스트 케이스의 개수
length

length 속성을 활용하여 inputData의 길이를 구하여 테스트 케이스의 개수를 구합니다.

입력의 마지막에는 0 두 개가 들어온다.

입력의 마지막에 0 두 개가 들어오므로 1을 빼줍니다. 그러므로 예제 입력에 따라서 count5로 만들어줍니다.

for (각 테스트 케이스에 대한 반복문)

for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase[0] + testCase[1]);
}
for (let i = 0; i < count; i++) {}

예제에서 count의 값은 5입니다. 마지막 입력 0 두 개를 제외하면 테스트 케이스들에 해당하는 인덱스는 0,1,2,3,4 총 5가지입니다.

이것을 활용하여 뒤에 나오는 연산을 진행합니다.

testCase
for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
}

각각의 테스트 케이스들을 의미하는 testCase라는 변수를 생성하고 이하에 나오는 과정을 testCase라는 변수에 정의합니다.

split() (각 testCase에 대한 배열 생성)
for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ");

  console.log(testCase);
  // [ '1', '1' ]
  // [ '2', '3' ]
  // [ '3', '4' ]
  // [ '9', '8' ]
  // [ '5', '2' ]
}

// i = 0 의 경우 [ '1', '1' ]
// i = 1 의 경우 [ '2', '3' ]
// i = 2 의 경우 [ '3', '4' ]
// i = 3 의 경우 [ '9', '8' ]
// i = 4 의 경우 [ '5', '2' ]

testCase라는 변수에 inputData[i]inputData의 각 인덱스로부터 " " 즉 공백을 매개변수로 가지는 split() 메서드를 통해 각 테스트 케이스에 대한 배열을 생성합니다.

map() (각 testCase에 대한 배열의 형식 변환)
for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase);
  //  [ 1, 1 ]
  //  [ 2, 3 ]
  //  [ 3, 4 ]
  //  [ 9, 8 ]
  //  [ 5, 2 ]
}
// i = 0 의 경우 [ 1, 1 ]
// i = 1 의 경우 [ 2, 3 ]
// i = 2 의 경우 [ 3, 4 ]
// i = 3 의 경우 [ 9, 8 ]
// i = 4 의 경우 [ 5, 2 ]

생성한 배열을 map() 메서드를 활용하여 callback함수 (value) => +value)를 통해 문자열이였던 형식을 숫자 형식으로 바꿔줍니다.

결과값 출력하기
console.log(testCase[0] + testCase[1]);
// 2
// 5
// 7
// 17
// 7
console.log()

console.log() 메서드를 통해 testCase[0] + testCase[1]testCase인덱스 01의 값을 합한 결과값을 출력합니다.

13. A+B-4

https://www.acmicpc.net/problem/10951

문제

A+B-4

문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
입력은 여러 개의 테스트 케이스로 이루어져 있다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력
각 테스트 케이스마다 A+B를 출력한다.

예제 입력 1
1 1
2 3
3 4
9 8
5 2

예제 출력 1
2
5
7
17
7

해답

const fs = require("fs");

const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim()
  .split("\n");

const count = inputData.length;

for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase[0] + testCase[1]);
}

풀이

inputData (입력값)

파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 31 20 31 0a 32 20 33 0a 33 20 34 0a 39 20 38 0a 35 20 32>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

문자열 형식으로 변환
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
toString()

Buffer 형식으로 출력된 값을 toString()을 통해 기본값인 "utf8" 형식으로 출력합니다.

공백 제거
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim();

console.log(inputData);
// 1 1
// 2 3
// 3 4
// 9 8
// 5 2
trim()

trim()을 활용하여 문자열 양 끝의 공백을 제거합니다.

배열 생성
const inputData = fs
  .readFileSync(
    process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
  )
  .toString()
  .trim()
  .split("\n");

console.log(inputData); // [ '1 1', '2 3', '3 4', '9 8', '5 2' ]
split()

split()을 활용하여 매개변수에 다음줄을 의미하는 "\n"를 넣어 배열을 만듭니다.

count

const count = inputData.length;

console.log(count); // 5
테스트 케이스의 개수
length

length 속성을 활용하여 inputData의 길이를 구하여 테스트 케이스의 개수를 구합니다.

for (각 테스트 케이스에 대한 반복문)

for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase[0] + testCase[1]);
}
for (let i = 0; i < count; i++) {}

count의 값은 5입니다. 테스트 케이스들에 해당하는 인덱스는 0,1,2,3,4 총 5가지입니다.

이것을 활용하여 뒤에 나오는 연산을 진행합니다.

testCase
for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);
}

각각의 테스트 케이스들을 의미하는 testCase라는 변수를 생성하고 이하에 나오는 과정을 testCase라는 변수에 정의합니다.

split() (각 testCase에 대한 배열 생성)
for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ");

  console.log(testCase);
  // [ '1', '1' ]
  // [ '2', '3' ]
  // [ '3', '4' ]
  // [ '9', '8' ]
  // [ '5', '2' ]
}

// i = 0 의 경우 [ '1', '1' ]
// i = 1 의 경우 [ '2', '3' ]
// i = 2 의 경우 [ '3', '4' ]
// i = 3 의 경우 [ '9', '8' ]
// i = 4 의 경우 [ '5', '2' ]

testCase라는 변수에 inputData[i]inputData의 각 인덱스로부터 " " 즉 공백을 매개변수로 가지는 split() 메서드를 통해 각 테스트 케이스에 대한 배열을 생성합니다.

map() (각 testCase에 대한 배열의 형식 변환)
for (let i = 0; i < count; i++) {
  const testCase = inputData[i].split(" ").map((value) => +value);

  console.log(testCase);
  //  [ 1, 1 ]
  //  [ 2, 3 ]
  //  [ 3, 4 ]
  //  [ 9, 8 ]
  //  [ 5, 2 ]
}
// i = 0 의 경우 [ 1, 1 ]
// i = 1 의 경우 [ 2, 3 ]
// i = 2 의 경우 [ 3, 4 ]
// i = 3 의 경우 [ 9, 8 ]
// i = 4 의 경우 [ 5, 2 ]

생성한 배열을 map() 메서드를 활용하여 callback함수 (value) => +value)를 통해 문자열이였던 형식을 숫자 형식으로 바꿔줍니다.

결과값 출력하기
console.log(testCase[0] + testCase[1]);
// 2
// 5
// 7
// 17
// 7
console.log()

console.log() 메서드를 통해 testCase[0] + testCase[1]testCase인덱스 01의 값을 합한 결과값을 출력합니다.

14. 더하기 사이클

https://www.acmicpc.net/problem/1110

문제

더하기 사이클

문제
0보다 크거나 같고, 99보다 작거나 같은 정수가 주어질 때 다음과 같은 연산을 할 수 있다. 먼저 주어진 수가 10보다 작다면 앞에 0을 붙여 두 자리 수로 만들고, 각 자리의 숫자를 더한다. 그 다음, 주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다. 다음 예를 보자.

26부터 시작한다. 2+6 = 8이다. 새로운 수는 68이다. 6+8 = 14이다. 새로운 수는 84이다. 8+4 = 12이다. 새로운 수는 42이다. 4+2 = 6이다. 새로운 수는 26이다.

위의 예는 4번만에 원래 수로 돌아올 수 있다. 따라서 26의 사이클의 길이는 4이다.

N이 주어졌을 때, N의 사이클의 길이를 구하는 프로그램을 작성하시오.

입력
첫째 줄에 N이 주어진다. N은 0보다 크거나 같고, 99보다 작거나 같은 정수이다.

출력
첫째 줄에 N의 사이클 길이를 출력한다.

예제 입력 1
26

예제 출력 1
4

예제 입력 2
55

예제 출력 2
3

예제 입력 3
1

예제 출력 3
60

예제 입력 4
0

예제 출력 4
1

예제 입력 5
71

예제 출력 5
12

해답

const fs = require("fs");

const inputData = +fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

let value = inputData;
let sum;
let cycle = 0;

do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while (inputData !== value);

console.log(cycle);

풀이

inputData (입력값)

const inputData = +fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);
파일 읽어오기
const fs = require("fs");

const inputData = fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // <Buffer 32 36>
readFileSync()

백준에서 추천하는 방식은 node.js에서 fs 모듈의 readFileSync()를 이용하는 것입니다.

작동 시스템 구별
process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt";
process.platform

process.platform"linux"인 경우 경로를 "/dev/stdin"으로 향하게 하고 그것이 아니면 사용자가 지정한 파일을 향하게 합니다.

숫자 형식으로 변환
const inputData = +fs.readFileSync(
  process.platform === "linux" ? "/dev/stdin" : "../../../../index.txt"
);

console.log(inputData); // 26
+

+를 통해 버퍼 형식이었던 값을 숫자 형식으로 변환해줍니다.

value

let value = inputData;

console.log(value); // 26
value로 inputData 값 선언
let

inputData의 값을 value라는 변수로 let 명령문을 활용하여 선언해줍니다.

let 명령문으로 value 값은 수정 가능한 값이 됩니다.

sum

let sum;

console.log(sum); // undefined
value 값의 일의 자리와 십의 자리의 합
let

sum 변수는 value값의 십의 자리와 일의 자리를 합한 수를 담는 변수입니다.

let 명령문을 활용하여 선언해줘 sum수정 가능한 값이 됩니다.

cycle

let cycle = 0;

console.log(cycle); // 0
사이클의 길이
let

let 명령문을 활용하여 사이클의 길이를 의미하는 변수 cycle0으로 선언합니다.

초기 사이클의 값은 0이고 cycle수정 가능한 값이 됩니다.

do...while

do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while (inputData !== value);

do...while을 활용해 사이클의 값을 구합니다.

cycle++ (cycle값 1개씩 증가)
do {
  cycle++
} while ();
++

증가(++)를 통해 cycle은 과정이 한 번 시작되었기 때문에 do...while문이 시작함과 동시에 증가하게 합니다.

sum (value의 일의 자리 십의 자리 합)
do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
} while ();

// expected output:
// 2 + 6 = 8
Math.floor

Math.floor 함수를 통해 주어진 수 이하의 가장 큰 정수를 반환합니다.

즉 예제값 26value / 10의 과정을 거치면 2.6이 됩니다. 여기서 Math.floor를 통해 반환한 값은 2입니다. 값의 십의 자리를 반환하는 것입니다.

이렇게 반환한 값과 value % 10 나머지 즉 일의 자리 값, 예제로 따지면 6을 합합니다.

그리하여 sum의 값은 8이 됩니다.

value
do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while ();

// expected output:
// 60 + 8 = 68

value는 초기값으로 inputData를 가지는 값을 가지고 있습니다.

주어진 수의 가장 오른쪽 자리 수와 앞에서 구한 합의 가장 오른쪽 자리 수를 이어 붙이면 새로운 수를 만들 수 있다.

위 블록주석대로 (value % 10) * 10 연산을 통해 주어진 수의 가장 오른쪽 자리 수, 즉 value10으로 나눈 나머지를 구하고 10을 곱하고,

sum % 10 연산을 통해 합의 가장 오른쪽 자리 수, 즉 sum10으로 나눈 나머지를 구하여 둘을 합합니다.

합한 값을 value 값으로 초기화합니다.

while 내의 조건식
do {
  cycle++;
  sum = Math.floor(value / 10) + (value % 10);
  value = (value % 10) * 10 + (sum % 10);
} while (inputData !== value);

초기값인 inputData와 다시 초기화가 된 value 값이 일치하지 않으면 즉 true면 do...while 문을 빠져나오지 않고 계속 일치할때까지 진행하고, 일치하면 즉 false라면 빠져나옵니다.

결과값 출력하기

console.log(cycle); // 4
cycle 출력
console.log()

console.log() 메서드를 통해 cycle 값을 출력합니다.

댓글