function solution(me, cow) {
let answer = Number.MAX_SAFE_INTEGER;
const queue = [{ current: me, jump: 0 }];
while (true) {
// 큐의 값을 하나 쉬프트 해준다. -> 너비우선탐색
const { jump, current } = queue.shift();
if (current + 1 === cow || current - 1 === cow || current + 5 === cow) {
// 자식들이 도달한 경우라면 break;
answer = jump + 1;
break;
}
// 자식들이 도달하지 못한 경우이므로 큐에 넣어준다.
queue.push({ current: current + 1, jump: jump + 1 });
queue.push({ current: current - 1, jump: jump + 1 });
queue.push({ current: current + 5, jump: jump + 1 });
}
console.log(answer);
}
function solution(me, cow) {
const dis = [...new Array(Math.max(me, cow) + 1)].map(() => 0);
let answer = 0;
let current;
const dir = [1, -1, 5];
const queue = [me];
const visited = [];
while (answer === 0) {
current = queue.shift();
visited.push(current);
for (const d of dir) {
if (current + d === cow) {
// 현재 방에서 갈 수 있는 자식이 도달한 경우
answer = dis[current] + 1;
break;
}
if (dis[current + d] >= 0 && !visited.includes(current + d)) {
// 현재 방에서 갈 수 있는 자식이 도달하지 못한 경우
// 이미 탐색했던 탐색한 방이 아니라면 큐에 넣는다.
dis[current + d] = dis[current] + 1;
queue.push(current + d);
}
}
}
}
function solution(me, cow) {
const dis = [...new Array(Math.max(me, cow) + 1)].map(() => 0);
let answer = 0;
let current;
const queue = [me];
while (answer === 0) {
current = queue.shift();
for (const d of [1, -1, 5]) {
if (current + d === cow) {
// 현재 방에서 갈 수 있는 자식이 도달한 경우
answer = dis[current] + 1;
break;
}
if (dis[current + d] === 0 && current + d !== me) {
// current+d !== me 조건이 없다면 부모를 다시 들어갈 수 있게됨
// 왔던 방은 돌아가지 않는다. 이미 큐에 넣은 방들은 값들이 0이 아닌 값으로 채워져있다.
// 현재 방에서 갈 수 있는 자식이 도달하지 못한 경우
dis[current + d] = dis[current] + 1;
queue.push(current + d);
}
}
}
console.log(dis);
console.log(answer);
}
function solution() {
const array = [1, 2, 3, 4, 5, 6, 7];
const queue = [0];
let current;
while (queue.length !== 0) {
current = queue.shift();
const left = 2 * current + 1;
const right = 2 * current + 2;
if (array[left]) queue.push(left);
if (array[right]) queue.push(right);
}
}
function validation(u) {
const stack = [];
for (let c of u) {
if (c === "(") {
stack.push(c);
} else {
stack.pop();
}
}
return stack.length === 0;
}
function getUV(p) {
let LEFT = 0;
let RIGHT = 0;
for (let [index, char] of p.split("").entries()) {
char === "(" ? LEFT++ : RIGHT++;
if (LEFT === RIGHT) return [p.slice(0, index + 1), p.slice(index + 1)];
}
}
function solution(p) {
if (p.length === 0) return "";
const [u, v] = getUV(p);
if (validation(u)) {
return u + solution(v);
}
return (
`(${solution(v)})` +
[...u.slice(1, u.length - 1)].map((c) => (c === "(" ? ")" : "(")).join("")
);
}
console.log(solution("()))((()"));
너비우선탐색에서 이미 넣은 것은 넣으면 안된다
array.entries() => [index,item]이 담긴 iterator로 리턴된다.
for (let [index, char] of p.split("").entries()) {
char === "(" ? LEFT++ : RIGHT++;
if (LEFT === RIGHT) return [p.slice(0, index + 1), p.slice(index + 1)];
}