티스토리 뷰
320x100
2021년 2월 8일 Velog에 작성한 글을 옮겨온 글입니다.
프로그래머스 - 스킬트리
답안 1
function solution(skill, skill_trees) {
const skill_regex = new RegExp(`[^${skill}]`, 'g');
const skill_len = skill.length;
return skill_trees.reduce((cnt, tree) => {
tree = tree.replace(skill_regex, ''); // skill에 속하는 문자만 남김
for(let i = 0, tree_len = tree.length; i < skill_len && i < tree_len; i++) {
if (skill[i] !== tree[i]) return cnt; // 순서가 다를 경우 cnt에 +1 하지 않음
}
return cnt + 1; // 순서가 맞을 경우 cnt + 1
}, 0);
}
우선 skill_regex를 만들어 skill_trees에서 선행 스킬 순서와 관련 없는 문자를 제거한 후, skill과 tree 내의 문자 순서를 비교하여 같은 경우에는 가능한 스킬 트리의 수(cnt)를 1 증가 시켰습니다.
답안 2
function solution(skill, skill_trees) {
const skill_regex = new RegExp(`[^${skill}]`, 'g');
return skill_trees.reduce((cnt, tree) => {
tree = tree.replace(skill_regex, ''); // skill에 속하는 문자만 남김
return cnt + (skill.indexOf(tree) ? 0 : 1); // indexOf
}, 0);
}
function solution(skill, skill_trees) {
const skill_regex = new RegExp(`[^${skill}]`, 'g');
return skill_trees.reduce((cnt, tree) => {
tree = tree.replace(skill_regex, ''); // skill에 속하는 문자만 남김
return cnt + (skill.startsWith(tree) ? 1 : 0); // startsWith
}, 0);
}
다른 분의 풀이를 보고 답안 1에서 중간에 for문으로 비교했던 부분을 함수로 변경했습니다. 동일한 코드에 indexOf와 startsWith를 적용해보았습니다.
시작점 비교로 사용하는 경우, indexOf보다 startsWith가 (용도도 적절하고) 좀 더 좋은 성능을 내는 것 같습니다.[참고]
답안 3
function solution(skill, skill_trees) {
const skill_regex = new RegExp(`[^${skill}]`, 'g');
return skill_trees.map(tree => tree.replace(skill_regex, ''))
.filter(tree => skill.indexOf(tree))
.length; // indexOf
}
function solution(skill, skill_trees) {
const skill_regex = new RegExp(`[^${skill}]`, 'g');
return skill_trees.map(tree => tree.replace(skill_regex, ''))
.filter(tree => skill.startsWith(tree))
.length; // startsWith
}
map과 filter로 2번 돌리는 것보다는 reduce로 한 번에 다 처리하는 것이 더 빠르지 않을까 싶어서 처음에 reduce로 접근했었는데, 같은 O(n)이여서인지 그닥 차이는 없는 것 같습니다.
320x100
'개발 > Algorithm' 카테고리의 다른 글
프로그래머스 | 124 나라의 숫자(JavaScript) (0) | 2021.06.16 |
---|---|
프로그래머스 | 파일명 정렬(JavaScript) (0) | 2021.06.14 |
프로그래머스 | k번째 수(JavaScript) (0) | 2021.06.11 |
프로그래머스 | 튜플(JavaScript) (0) | 2021.06.07 |
구름 | 사은품 교환하기(JavaScript) (0) | 2021.06.04 |
댓글
최근에 올라온 글
TAG
- Webpack Error
- fs-extra
- mkdirp
- 페이지 특정 위치 link
- javascript event
- node file package
- 프로그래머스
- sass
- 인가
- 스토리북 에러
- 스터디
- ELIFECYCLE
- errno 253
- node mkdir -p
- node cp -r
- node fs
- external editor
- file opener preference
- 자바스크립트
- make-dir
- jest
- createAction
- 웹팩 에러
- Storybook Error
- ECONNRESET
- ModuleParseError: Module parse failed: Unexpected token
- 인증
- rimraf
- JavaScript
- node rm -rf