본문 바로가기
알고리즘/프로그래머스 문제-JS

[JS]카드 뭉치

by sweesweet 2023. 3. 28.

https://school.programmers.co.kr/learn/courses/30/lessons/159994

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

stack&queue 문제였던것 같다 

 

조건에 대해 많이 헤맸었는데 이 문제에서 유의할 점은 이거다

  1. goal은 일종의 교집합이다.✨(cards1이나 cards2에 쓸모없는 카드가 있을 수 있다)
  2. goal에 만족해도 cards1+cards2의 길이가 남아있을 수 있다(pop으로 할 시)
  3. pop으로 할 시, goal에 포함되지 않더라도, 아직 goal에 해당되는 단어가 나오지 않았다면 pop해줘야 한다
  4. goal에 해당되는 카드가 등장한 후 goal에 포함되지 않는 카드가 나온다면  'No' 다
  5. 루프가 끝나고 나서 뭐가 남아있다면 '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