JavaScript 백준 온라인 알고리즘 공부
백준 1157 번 Node.js 문제풀이
그룹 단어 체커
https://www.acmicpc.net/problem/1316
const fs = require("fs");
const [N, ...arr] = (
process.platform === "linux"
? fs.readFileSync("/dev/stdin").toString()
: `4
abbbbbb
abaccccccccc
abccctcccffff
aaaaaj
`
)
.trim()
.split("\n");
let numWords = Number(N);
let count = 0;
for (let i = 0; i < numWords; i++) {
let newArr = [];
let nowArr = arr[i];
for (let j = 0; j < nowArr.length; j++) {
if (newArr.indexOf(nowArr[j]) === -1 || nowArr[j - 1] === nowArr[j]) {
newArr += nowArr.slice(j, j + 1);
} else {
break;
}
}
if (newArr.length === nowArr.length) {
count++;
}
}
console.log(count);
입력된 문자배열nowArr
과 대조할 새배열newArr
를 생성해두고 기존에 없는 문자newArr.indexOf(nowArr[j]) === -1
이거나 왼쪽 요소안의 문자와 같으면nowArr[j - 1] === nowArr[j]
비교한 요소를 새배열에 집어 넣었다.newArr += nowArr.slice(j, j + 1)
이렇게하면 조건에 맞지 않는건 새배열에 들어가지 못하고 비교했던 입력배열과 길이가 달라지고 그룹단어가 아니므로 카운트하지 않는다 .
반대로 모두 조건에 충족하면 당연히 배열의 길이는 서로 같아지므로newArr.length === nowArr.length
카운트 count++
하게된다.
이렇게 카운트를 마친 숫자가 곧 그룹단어의 갯수console.log(count)
가 된다.
기존의 배열을 놔두면서 새배열을 완성해 나아가는 메서드를 여전히 햇갈려서 좀 고생을 했다. 이 경우는 Array.prototype.slice()
가 확실히 쓰임새가 있다. 요소 하나하나 넣는거면 +=
의 연산자도 빼먹으면 안된다.
새배열에 들어가는 조건을 충족 못할 때 바로 break 문
을 추가해 남은 배열순회를 막았다. 없어도 문제를 통과할 수 있지만 단 한번이라도 배열에 안넣으면 그 배열은 이미 그룹단어로서 실격이라 그 이상 순회비교하는게 낭비이므로 적절한 코드임은 틀림없다.