혹시나 잘못된 개념 전달이 있다면 댓글 부탁드립니다. 저의 성장의 도움이 됩니다.
코니는 영어 단어가 적힌 카드 뭉치 두 개를 선물로 받았습니다. 코니는 다음과 같은 규칙으로 카드에 적힌 단어들을 사용해 원하는 순서의 단어 배열을 만들 수 있는지 알고 싶습니다.
원하는 카드 뭉치에서 카드를 순서대로 한 장씩 사용합니다.
한 번 사용한 카드는 다시 사용할 수 없습니다.
카드를 사용하지 않고 다음 카드로 넘어갈 수 없습니다.
기존에 주어진 카드 뭉치의 단어 순서는 바꿀 수 없습니다.
예를 들어 첫 번째 카드 뭉치에 순서대로 ["i", "drink", "water"], 두 번째 카드 뭉치에 순서대로 ["want", "to"]가 적혀있을 때 ["i", "want", "to", "drink", "water"] 순서의 단어 배열을 만들려고 한다면 첫 번째 카드 뭉치에서 "i"를 사용한 후 두 번째 카드 뭉치에서 "want"와 "to"를 사용하고 첫 번째 카드뭉치에 "drink"와 "water"를 차례대로 사용하면 원하는 순서의 단어 배열을 만들 수 있습니다.
문자열로 이루어진 배열 cards1, cards2와 원하는 단어 배열 goal이 매개변수로 주어질 때, cards1과 cards2에 적힌 단어들로 goal를 만들 있다면 "Yes"를, 만들 수 없다면 "No"를 return하는 solution 함수를 완성해주세요.
shift
메서드를 사용한다면 전체 복잡도는 O(n^2)function solution(cards1, cards2, goal) {
const loopCount = goal.length;
cards1.reverse();
cards2.reverse();
for(let i = 0; i < loopCount; i++){
const el = goal[i];
if(cards1.at(-1) === el){
cards1.pop();
} else if( cards2.at(-1) === el){
cards2.pop();
} else {
return "No"
// for문에서는 최초 "No" 를 반환하면 함수가 종료
}
}
return "Yes"
}
function solution(cards1, cards2, goal) {
let result = "Yes";
cards1.reverse();
cards2.reverse();
goal.forEach((el,idx)=>{
if(cards1.at(-1) === el){
cards1.pop();
} else if( cards2.at(-1) === el){
cards2.pop();
} else {
result = "No";
// 고차함수의 콜백함수에서는 return "No" 를 해도 solution함수의 반환값이 "No"가 되지 않는다.
// for문에서 continue와 같이 처리되므로 변수에 재할당 하는 방식으로 풀이했다.
}
});
return result;
}
for문과 고차함수를 사용하는것의 차이가 궁금해서 2번 제출했는데, ver2는 속도가 미세하게 느리지만 메모리가 더 적다. 결국 비슷하니 빨리 끝내고 하나 더 푸는게 나을것 같다. shift
로 풀이해도 테스트케이스에서는 시간과 메모리가 비슷하게 표현되긴한다.
하지만, O(n)과 O(n^2)의 비교에서는 O(n)이 유리할 것이다.