각 카드 뭉치의 순서를 나타내는 포인터를 사용하여 풀이했다.
function solution(cards1, cards2, goal) {
var answer = "No";
let point1 = 0, point2 = 0, pointG = 0;
while(true){
if(pointG === goal.length){
answer = "Yes";
break;
}
let flag = false;
if(goal[pointG] === cards1[point1]){
pointG++; point1++;
flag = true;
}
else if(goal[pointG] === cards2[point2]){
pointG++; point2++;
flag = true;
}
if(flag === false){
break;
}
}
return answer;
}
문제를 풀이하다 카드 뭉치 확인 순서가 중요한지에 관한 의문이 들었으나 여기서 카드 뭉치를 확인하는 순서는 중요하지 않다.
문제에 따르면 cards1과 cards2에는 서로 다른 단어만 존재
하기 때문이다.
그러나 cards1(ex.["i", "want"]
)과 cards2(ex.["want", "to", "drink", "water"]
)에 중복된 단어가 존재한다면, 이 경우에는 코드에 순서를 고려해야한다.
*namiezexx@gmail.com 님의 풀이를 참고하였습니다.
1. while문을 for문으로 바꿔서 가독성 개선
여러 flag 활용 부분을 생략하여 가독성을 개선한다
2. 포인터 대신 shift()
*shift()
; 배열에서 첫 번째 요소를 제거하고, 제거된 요소를 반환한다. 원본 배열의 길이가 변한다.
- 빈 배열의 경우 undefined
를 반환한다
function solution(cards1, cards2, goal) {
for(let i=0;i<goal.length;i++){
if(cards1[0] == goal[pointG]){
cards1.shift();
pointG++;
}
else if(cards2[0] == goal[pointG]){
cards2.shift();
pointG++;
}
else {
return "No";
}
}
return "Yes";
}