문제 66 : 블럭탑 쌓기

1 minute read

문제 66 : 블럭탑 쌓기

// 탑을 순서에 맞게 쌓아야 합니다
// 정해진 순서가 BAC라면 A 다음 C가 쌓아져야 합니다.
// B를 쌓지 않아도 A와 C를 쌓을 수 있습니다.
// B 다음 블럭이 C가 될 수 있습니다.

// 입력
// 탑 = ["ABCDEF", "BCAD", "ADEFQRX", "BEDFG", "EFGHZ"]
// 규칙 = "ABD"

// 출력
// ["가능", "불가능", "가능", "가능", "가능"]

자바스크립트의 indexOf

indexOf 메서드는 주어진 값과 일치하는 첫 번째 인덱스를 반환합니다.
그리고 일치하는 값이 없으면 -1을 반환합니다.

str.indexOf(searchValue[, fromIndex])

두개의 매개변수가 주어질 수 있습니다.
searchValue는 찾으려는 문자열이고, fromIndex는 찾기 시작하는 위치를 나타내는 인덱스값입니다.
두번째 매개변수를 통해서 꼭 첫번째 값이 아니라더라고 찾을수가 있습니다.

const str = "ABCDEAA";

str.indexOf("A"); //0

위의 코드는 맨 첫번째 A를 찾습니다. 그래서 그 인덱스인 0을 반환합니다.

const str = "ABCDEAA";
let temp = -1;

for (let i = 0; i < 3; i++) {
  temp = str.indexOf("A", temp + 1);
}

console.log(temp);

위의 코드는 3번째로 등장하는 A의 인덱스를 찾습니다. 이처럼 두번째 매개변수인 fromIndex를 통해서 꼭 첫 번째 값이 아니더라도 찾을 수 있습니다.

풀이 1

// 규칙: "ACE", 배열: ["ABCDE"]
// 규칙의 길이만큼 루프를 돌린다.
// 배열값에서 규칙의 [0]을 찾는다. 있다? 없다?
// 없으면 배열값에서 규칙의 [1]을 찾는다, 있다? 없다?
function checkRule(rule, arr) {
  let temp = -1;
  for (let i = 0; i < rule.length; i++) {
    if (arr.indexOf(rule[i]) !== -1) {
      // 존재한다면
      // 넣기 전에 temp값과 index 값 비교
      let index = arr.indexOf(rule[i]);
      if (temp < index) {
        temp = index;
      } else {
        return "불가능";
      }
    }
  }
  return "가능";
}

function s(rule, arr) {
  let answer = [];
  for (let i of arr) {
    answer.push(checkRule(rule, i));
  }
  return answer;
}

const block = ["ABCDEF", "BCAD", "ADEFQRX", "BEDFG", "AEBFDGCH"];
const rule = "ABCD";

console.log(s(rule, block));
// ["가능", "불가능", "가능", "가능", "불가능"]

Leave a comment