Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

레벨 2 / 스킬트리 - feat: 풀이 추가 #112

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 54 additions & 1 deletion level-2/스킬트리&49993&.js
Original file line number Diff line number Diff line change
@@ -13,4 +13,57 @@ function solution(skill, skill_trees) {
function checkOrder(checkArr) {
for (let i = 0; i < checkArr.length; i++) if (checkArr[i] !== i) return false
return true
}
}

//정답 2 - minkyeongJ
function solution(skill, skill_trees) {
//return할 변수
var answer = 0;

//파라미터로 받은 값을 모두 비교가능하게 쪼갬
const skillArr = Array.from(skill);
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

문자열은 유사배열 객체이기 때문에 위와 같은 방법도 가능합니다!
다만 함수는 최대한 적게 써야 좋으니 아래와 같이 가독성 좋은 방법도 고려해보세요!

Suggested change
const skillArr = Array.from(skill);
const skillArr = [...skill]

혹은
const skillArr = skill.split('')

const skillTreesElementArr = skill_trees.map(skillTreesElement => Array.from(skillTreesElement));
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const skillTreesElementArr = skill_trees.map(skillTreesElement => Array.from(skillTreesElement));
const skillTreesElementArr = skill_trees.map(skillTreesElement => [...skillTreesElement]);


//스킬이 있는 위치 체크
let checkArr = [];

/** skillTreesElementArr에 있는 배열 순서대로 skillArr의 값과 비교
* 일치하는 값은 skillArr의 배열번호로 변환하여 새로운 배열에 삽입
* 배열을 모두 순환했는데도 값이 일치하지 않으면 27 반환
*/
skillTreesElementArr.forEach((skillTreesElement, i) => {
checkArr[i] = [];
skillArr.forEach((skillElement, j) => {
for(let number = 0; number < skillTreesElement.length; number++){
if(skillTreesElement[number] === skillElement){
//같다면 number을 check[i]에 push
checkArr[i].push(number);
break;
}else if(skillTreesElement.length === number+1 && checkArr[i].length === j){
//값을 다 비교했을 때 매칭되는 것이 없으면 27 입력
checkArr[i].push(27);
}
}
})
Comment on lines +36 to +47
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for 문 에서 if 조건에 해당하는 값을 발견하지 못했을 때 '27' 이라는 값을 push 하는 것이 목표였다면 아래와 같은 표현도 고려해보세요!
forEach 내에서 return은 다음 forEach 의 반복으로 가는 것을 의미합니다!

Suggested change
skillArr.forEach((skillElement, j) => {
for(let number = 0; number < skillTreesElement.length; number++){
if(skillTreesElement[number] === skillElement){
//같다면 number을 check[i]에 push
checkArr[i].push(number);
break;
}else if(skillTreesElement.length === number+1 && checkArr[i].length === j){
//값을 다 비교했을 때 매칭되는 것이 없으면 27 입력
checkArr[i].push(27);
}
}
})
skillArr.forEach((skillElement, j) => {
for(let number = 0; number < skillTreesElement.length; number++){
if(skillTreesElement[number] === skillElement){
checkArr[i].push(number);
return;
}
}
checkArr[i].push(27);
})

})
Comment on lines +24 to +48
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고차함수를 사용하면 코드가 조금 checkArr를 만드는 과정이 더 간결해질 수 있을 것 같습니다!!

아래와 같은 방법을 고려해보세요 😄

Suggested change
const skillArr = Array.from(skill);
const skillTreesElementArr = skill_trees.map(skillTreesElement => Array.from(skillTreesElement));
//스킬이 있는 위치 체크
let checkArr = [];
/** skillTreesElementArr skillArr
* 일치하는 값은 skillArr의 배열번호로 변환하여 새로운 배열에 삽입
* 배열을 모두 순환했는데도 값이 일치하지 않으면 27 반환
*/
skillTreesElementArr.forEach((skillTreesElement, i) => {
checkArr[i] = [];
skillArr.forEach((skillElement, j) => {
for(let number = 0; number < skillTreesElement.length; number++){
if(skillTreesElement[number] === skillElement){
//같다면 number을 check[i]에 push
checkArr[i].push(number);
break;
}else if(skillTreesElement.length === number+1 && checkArr[i].length === j){
//값을 다 비교했을 때 매칭되는 것이 없으면 27 입력
checkArr[i].push(27);
}
}
})
})
const checkArr = skill_trees.map(tree =>
[...skill].map(s => {
const num = [...tree].findIndex(t => t === s);
return num < 0 ? 27 : num;
})
);

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레퍼런스


//checkArr 배열 앞 뒤 크기 비교해서 오름차순인지 확인하기
checkArr.forEach(checkArrElement => {
//배열의 길이가 1일 때 answer++
if(skill.length === 1){
answer++;
}
//배열 앞 뒤 크기 비교해서 오름차순인지 확인
for(let i = 1; i < checkArrElement.length ; i++){
if(checkArrElement[i-1] > checkArrElement[i]){
//오름차순이 아니면 break
break;
}else if(i === checkArrElement.length - 1){
//오름차순이면 answer++;
answer++;
}
}
});

return answer;
Comment on lines +51 to +68
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

checkArr에서 오름차순인 것의 갯수를 찾는 것이 목적이라면 아래와 같은 방법도 고려해보세요!

Suggested change
checkArr.forEach(checkArrElement => {
//배열의 길이가 1일 때 answer++
if(skill.length === 1){
answer++;
}
//배열 앞 뒤 크기 비교해서 오름차순인지 확인
for(let i = 1; i < checkArrElement.length ; i++){
if(checkArrElement[i-1] > checkArrElement[i]){
//오름차순이 아니면 break
break;
}else if(i === checkArrElement.length - 1){
//오름차순이면 answer++;
answer++;
}
}
});
return answer;
return checkArr.filter(c => c.every((v, i) => (i < c.length - 1 ? v <= c[i + 1] : true))).length;

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

레퍼런스

}