[21/08/11 KATA NINJA] BFS + 괄호변환

NinjaJuunzzi·2021년 8월 11일
0

코드카타

목록 보기
11/36
post-thumbnail

송아지

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)];
  }
  • 문자열 배열화하기
    [...string]
profile
Frontend Ninja

0개의 댓글