https://school.programmers.co.kr/learn/courses/30/lessons/159994
stack&queue 문제였던것 같다
조건에 대해 많이 헤맸었는데 이 문제에서 유의할 점은 이거다
- goal은 일종의 교집합이다.✨(cards1이나 cards2에 쓸모없는 카드가 있을 수 있다)
- goal에 만족해도 cards1+cards2의 길이가 남아있을 수 있다(pop으로 할 시)
- pop으로 할 시, goal에 포함되지 않더라도, 아직 goal에 해당되는 단어가 나오지 않았다면 pop해줘야 한다
- goal에 해당되는 카드가 등장한 후 goal에 포함되지 않는 카드가 나온다면 'No' 다
- 루프가 끝나고 나서 뭐가 남아있다면 'No'다-> 앞에 카드를 사용하지 않았을 시 뒷카드로 넘어갈 수 없기 때문
function solution(cards1, cards2, goal) {
const isFirst=[true,true]
for(let i =goal.length-1;i>=0;i--){
if(cards1[cards1.length-1]===goal[i]){
cards1.pop()
isFirst[0]=false
}else if (cards2[cards2.length-1]===goal[i]){
cards2.pop()
isFirst[1]=false
}
else if(isFirst[0]&&goal.indexOf(cards1[cards1.length-1])===-1){
cards1.pop()
i++// goal에해당되지않았느데 해당 루프를 지나갈경우 잘못된 값을 뱉을 수 있다
}
else if(isFirst[1]&&goal.indexOf(cards2[cards2.length-1])===-1){
cards2.pop()
i++
}
else{
return 'No'
}
}
if(cards1.length+cards2.length){
return 'No'
}
return 'Yes'
}
pop()을 사용 할 시 더 복잡해 질 수 있다. 차라리 shift()를 사용하는 것이 조건을 그렇게 깊게 사용하지 않아도 될 것이다.
shift()를 사용할 경우는 그냥 goal에 해당하는 카드 아니면 false이기 때문에 코드 상 더욱 더 간단할 수 있다.
function solution(cards1, cards2, goal) {
for(let i =0;i<goal.length;i++){
if(cards1[0]===goal[i]){
cards1.shift()
}else if (cards2[0]===goal[i]){
cards2.shift()
}
else{
return 'No'
}
}
return 'Yes'
}
'알고리즘 > 프로그래머스 문제-JS' 카테고리의 다른 글
[JS/LV2] 우박수열 정적분 (0) | 2024.09.10 |
---|---|
[JS/LV3]입국 심사 (0) | 2024.08.18 |
[JS]주차 요금 계산 (0) | 2022.12.21 |
[JS] 겹치는 선분의 길이 (0) | 2022.11.01 |
[JS]키패드 누르기 (0) | 2022.07.12 |