백준
[Node.js] 백준 - 함수&문자열 문제 : 셀프 넘버, 한수, 아스키 코드, 숫자의 합, 알파벳 찾기, 문자열 반복, 단어 공부, 단어의 개수, 상수, 다이얼, 크로아티아 알파벳, 그룹 단어 체커
📝 Node.js를 이용해 백준 문제 풀기
Node.js를 이용해서 백준 문제를 풀고 있습니다.
함수 문제 (2개)
(1) 셀프 넘버
// (1) 셀프 넘버
const range = new Set([]);
for (let i = 1; i <= 10000; i++) {
range.add(i);
}
for (let i = 1; i <= 10000; i++) {
checkSelf(i, range);
}
function checkSelf(n, range) {
let sum = 0;
for (let i = 0; i < String(n).length; i++) {
sum += Number(String(n)[i]);
}
if (sum + n <= 10000) {
range.delete(sum + n);
}
}
console.log([...range].join("\n"));
(2) 한수
// (2) 한수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const num = Number(input[0]);
function check(num) {
let count = 0;
for (let i = 1; i <= num; i++) {
if (String(i).length === 1) {
count = i;
} else {
const size = Number(String(i)[0]) - Number(String(i)[1]);
const allSize = [];
for (let j = 0; j < String(i).length - 1; j++) {
const cur = Number(String(i)[j]);
const next = Number(String(i)[j + 1]);
if (cur - next === size) {
allSize.push(true);
} else {
allSize.push(false);
}
}
if (allSize.every((value) => value)) {
count += 1;
}
}
}
console.log(count);
}
check(num);
문자열 문제 (10개)
(1) 아스키 코드
// (1) 아스키 코드
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
console.log(input[0].charCodeAt(0));
(2) 숫자의 합
// (2) 숫자의 합
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const sum = input[1]
.split("")
.reduce((prev, cur) => Number(prev) + Number(cur), 0);
console.log(sum);
(3) 알파벳 찾기
// (3) 알파벳 찾기
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const str = input[0];
const alphabets = Array(26).fill(0);
for (let i = 0; i < 26; i++) {
alphabets[i] = str.indexOf(String.fromCharCode(97 + i));
}
console.log(alphabets.join(" "));
(4) 문자열 반복
// (4) 문자열 반복
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let answer = "";
for (let i = 0; i < input.length; i++) {
const cur = input[i].split(" ");
const num = cur[0];
const str = cur[1];
if (!num || !str) {
continue;
}
answer +=
str
.split("")
.map((item) => item.repeat(num))
.join("") + "\n";
}
console.log(answer);
(5) 단어 공부
// (5) 단어 공부
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
input = input[0].toUpperCase();
const alphabets = Array(26).fill(0);
input.split("").map((al) => {
alphabets[al.charCodeAt(0) - 65] += 1;
});
const maxCount = Math.max(...alphabets);
if (alphabets.filter((i) => i === maxCount).length > 1) {
console.log("?");
} else {
console.log(String.fromCharCode(alphabets.indexOf(maxCount) + 65));
}
(6) 단어의 개수
// (6) 단어의 개수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
if (input[0].split(" ")[0] === "") {
console.log(0);
} else {
console.log(input[0].split(" ").length);
}
(7) 상수
// (7) 상수
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const nums = input[0]
.split(" ")
.map((item) => Number(item.split("").reverse().join("")));
console.log(nums[0] > nums[1] ? nums[0] : nums[1]);
(8) 다이얼
// (8) 다이얼
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
// case1 (직접 객체 만들기)
const sec = {
A: 3,
B: 3,
C: 3,
D: 4,
E: 4,
F: 4,
G: 5,
H: 5,
I: 5,
J: 6,
K: 6,
L: 6,
M: 7,
N: 7,
O: 7,
P: 8,
Q: 8,
R: 8,
S: 8,
T: 9,
U: 9,
V: 9,
W: 10,
X: 10,
Y: 10,
Z: 10,
};
// case 2 (반복문으로 객체 만들기)
const newSec = {};
let num = 3;
for (let i = 0; i < 26; i++) {
const curAlphabet = String.fromCharCode(65 + i);
if (i < 18) {
newSec[curAlphabet] = num;
if (i % 3 === 2 && i !== 17) {
num += 1;
}
} else if (i === 18) {
newSec[curAlphabet] = num;
num += 1;
} else if (i > 18) {
newSec[curAlphabet] = num;
if (i % 3 === 0 && i !== 24) {
num += 1;
}
}
}
const res = input[0].split("").map((item) => newSec[item]);
// case2 일때 sec을 newSec으로 변경
console.log(res.reduce((prev, cur) => prev + cur, 0));
(9) 크로아티아 알파벳
- 백준 모범 답안이 정말 인상 깊었다.
// (9) 크로아티아 알파벳
// 실패 case01 (재귀법, tastcase가 많은 경우 콜스택 부족으로 실패)
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
input = input[0];
let count = 0;
const ctAlphabet = ["c=", "c-", "d-", "lj", "nj", "s=", "z="];
function check2(input) {
if (!input) {
console.log(count);
return;
}
const cur = input.slice(0, 2);
if (ctAlphabet.indexOf(cur) !== -1) {
count += 1;
return check2(input.slice(2));
} else if (cur === "dz") {
return check3(input.slice(0));
} else {
count += 1;
return check2(input.slice(1));
}
}
function check3(input) {
if (input.slice(0, 3) === "dz=") {
count += 1;
return check2(input.slice(3));
} else {
return check2(input);
}
}
check2(input);
// case 백준 모범 답안 (replace 방식)
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
input = input[0];
const ctAlphabets = ["c=", "c-", "dz=", "d-", "lj", "nj", "s=", "z="];
for (let alphabet of ctAlphabets) {
input = input.split(alphabet).join("Q");
}
console.log(input.length);
(10) 그룹 단어 체커
// (10) 그룹 단어 체커
const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
let count = 0;
for (let i = 1; i < input.length; i++) {
const rowSet = new Set([]);
const row = input[i].trim().split("");
let isGroup = true;
for (let i = 0; i < row.length; i++) {
const cur = row[i];
const prev = i === 0 ? 0 : row[i - 1];
if (cur !== prev && rowSet.has(cur)) {
isGroup = false;
break;
}
rowSet.add(cur);
}
if (isGroup) {
count += 1;
}
}
console.log(count);
'백준' 카테고리의 다른 글
[Node.js] 백준 - 기본 수학 문제 1 : 달팽이는 올라가고 싶다, ACM호텔, 부녀회장이 될테야 (0) | 2021.09.21 |
---|---|
[Node.js] 백준 - 기본 수학 문제 1 : 손익분기점, 벌집O(1), 분수찾기O(1) (0) | 2021.09.21 |
[Node.js] 백준 - 1차원 배열 문제 : 최소&최대, 최댓값, 숫자의 개수, 나머지, 평균, OX퀴즈, 평균은 넘겠지 (0) | 2021.09.21 |
[Node.js] 백준 문제 풀기(BaeckJoon) - 기본 입출력 문제, if 조건문 문제, for & while 반복문 문제 (0) | 2021.09.17 |