[프로그래머스 lev2/JS] 스킬트리

woolee의 기록보관소·2022년 11월 10일
0

알고리즘 문제풀이

목록 보기
93/178

문제 출처

프로그래머스 lev2 - 스킬트리

나의 풀이 (통과)

// 1
배열 res : 유저스킬배열 중 선행스킬순서에 해당하는 스킬만 넣을 배열을 생성한다

// 2
유저스킬배열을 map 이중순회하면서(일종의 skill_trees[i][j])

+-- 유저의 스킬들이 선행스킬에 해당하고(skill.includes(v[j])) &&
+-- 선행스킬의 순서에 맞는지 판단하기 위해 선행스킬의 indx보다 크거나 같은 값만 res[i]에 들어갈 수 있게 조건을 건다. (res[i]에 들어가지 못한다는 건 순서가 맞지 않다는 의미를 갖는다)
+-- 이때 동시에 선행스킬에 해당하는 스킬 개수도 세어준다(cnt)

// 3
마지막에 선행스킬에 해당하는 개수와 순서에 맞는 스킬 개수를 비교해서 이게 같아야 순서에 맞게 스킬을 배웠다는 의미를 갖는다.

function solution(skill, skill_trees) {
  skill=skill.split('');
  
  let answer = 0;
  let res = new Array(skill_trees.length).fill('');

  skill_trees.map((v,i) => {
    let cnt=0;
    [...v].map((_,j) => {
      if (skill.includes(v[j]) && res[i].length >= skill.indexOf(v[j])) {
        res[i] += v[j]
        cnt++;
      } else if (skill.includes(v[j])) {
        cnt++;
      }
    });

    if (cnt === res[i].length) answer++;
  })

  return answer;
}

console.log(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]));

다른 풀이

// new RegExp(pattern, flags?) Javascript 와 RegExp 정규 표현식

// [] 안에 ^가 들어가 있으므로 skill 이외 문자 대응
console.log(skill_trees.map((x) => x.replace(regex, '')));

// indexOf를 문자열에서 사용할 때 값이 있으면 첫번째 요소의 index만 반환한다.
console.log(skill_trees.map((x) => x.replace(regex, '')).filter((x) => skill.indexOf(x) === 0 || x === ""));

function solution(skill, skill_trees) {
  var answer = 0;
  var regex = new RegExp(`[^${skill}]`, 'g');

  return skill_trees
      .map((x) => x.replace(regex, ''))
      .filter((x) => {
          return skill.indexOf(x) === 0 || x === "";
      })
      .length
}

console.log(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]));

filter에 함수를 바로 넘겨줌으로써 인자로 문자열을 받도록 한다.

function solution(skill, skill_trees) {
  function isCorrect(n) {
      // const test = '[' + 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('').filter(v => !skill.includes(v)).join('') + ']*';
      let test = skill.split('');
      for (var i = 0; i < n.length; i++) {
          if (!skill.includes(n[i])) continue; // 각 문자가 스킬에 존재하는지 판단 (존재하지 않으면 continue)
          if (n[i] === test.shift()) continue; // 존재한다면 그 문자가 스킬의 첫문자인지 판단 (첫 문자면 continue, 첫문자가 아니면 false)
          return false;
      }
      return true;
  }    

  return skill_trees.filter(isCorrect).length;
}


console.log(solution("CBD", ["BACDE", "CBADF", "AECB", "BDA"]));
profile
https://medium.com/@wooleejaan

0개의 댓글