문제를 보고 dfs, 재귀 등을 떠올렸다.
왜냐하면 cards1, cards2 모두 어떤 카드덱(?)에서 먼저 뽑냐에 따라 결과가 달라질 것이라 생각했기 때문이다.
그런데 문제가 이상하게 어려웠다. 분명 lv - 1 인데 왜 이렇게 어렵지..
문제 제대로 읽기 ;;
문제에 보면 제한사항중 각 카드에는 서로 다른 카드만 존재한다고 나와있다.
즉, cards1, cards2 중 어떤걸 먼저 뽑느냐가 중요한게 아니라
있기만 하면 있는대로 뽑기만 하면되는 쉬운 문제였다.
그런데 나는 순서가 중요하다라고 가정하고 문제를 해결했다..
function solution(cards1, cards2, goal) {
let result ="No"
const dfs=(cards1,cards2,cardsIndex1,cardsIndex2,goalIndex)=>{
if(result==="Yes"){
return;
}
if(goalIndex===goal.length){
result="Yes"
return;
}
if(cardsIndex1===cards1.length&&cardsIndex2===cards2.length){
return;
}
if(cards1[cardsIndex1]===goal[goalIndex]){
dfs(cards1,cards2,cardsIndex1+1,cardsIndex2,goalIndex+1)
}
if(cards2[cardsIndex2]===goal[goalIndex]){
dfs(cards1,cards2,cardsIndex1,cardsIndex2+1,goalIndex+1)
}
}
dfs(cards1,cards2,0,0,0)
return result
}
dfs로 문제를 해결했다. 문제를 잘 읽어야한다..
그래도 오랜만에 dfs를 사용해 볼 수 있어 좋았다.
dfs의 핵심은 지금 상태를 기억하는 거 같다. 매개변수를 잘 활용해야한다.
제한을 제대로 읽었다면
function solution(cards1, cards2, goal) {
for(let i = 0 ; i<goal.length; i++){
const target = goal[i]
if(cards1.length>0&&cards1[0]===target){
cards1.shift()
}
else if(cards2.length>0&&cards2[0]===target){
cards2.shift()
}
else{
return "No"
}
}
return "Yes"
}
이런식으로 간단하게 해결해 줄 수 있다.