2차 공부/알고리즘

카드 뭉치

공대탈출 2024. 6. 10. 15:37

 

처음 작성한 코드

function solution(cards1, cards2, goal) {
    let answer = [true, true, true]
    console.log(answer.indexOf(false))
    let arr = goal[0] == cards1[0] ? [...cards1].map((x,i) => cards1[i] === goal[i]) : [...cards2].map((x,i) => cards2[i] === goal[i])
    let target = arr.indexOf(false)
    if (target === -1) {
        target = arr.length
    }
    let temp = goal[0] == cards1[0] ? [...cards1] : [...cards2]
    goal[0] == cards1[0] ? temp.splice(target, 0, ...cards2) : temp.splice(target, 0, ...cards1)
    return (temp.join('') == goal.join('')) ? "Yes" : "No"
}

문제를 해석을 잘못했다. cards1을 먼저 사용하고 cards2가 들어와야한다면, 거기서 cards2를 전부 사용하고 cards1로 넘어가야 한다고 생각을 했다.

그리하여 시작으로 사용되야 하는 카드뭉치를 구별하여 arr에 집어넣고

해당 arr에서 cards2가 들어가야하는 부분을 indexOf로 찾아내서 target에 넣는다.

만약 중간에 들어가야하지 않는다면 target이 -1이 되므로, target에 arr.length를 넣어 뒤에 붙도록 한다.

그 후 goal과 비교할 temp배열을 카드뭉치 구별 후 복사해주고, 아까 찾았던 원하는 위치에 사이나 뒤로 들어갈 카드뭉치를 넣어 temp와 goal을 문자열화 시켜 비교하고 Yes나 No를 반환하는 함수이다.

 

다시말하지만, 문제해석이 잘못되었기 때문에 가치가 없다.

또한 맞더라도 올바른 코딩일지는 잘 모르겠다.

 

두번째로 작성한 코드

function solution(cards1, cards2, goal) {
    for (let card of goal) {
        if (cards1[0] === card) {
            cards1.shift();
        } else if (cards2[0]=== card) {
            cards2.shift();
        } else return "No"
    }
    return "Yes"
}

 

문제에서 카드뭉치를 전부 사용하라고 했지, 한번씩만 사용할 수 있다고 하지 않았다.

따라서 for (let ~ of ~)를 사용하여 goal의 모든 요소를 특정 카드뭉치의 첫번째 요소와 비교하고

맞는 카드뭉치가 있다면 해당 카드뭉치의 첫 요소를 삭제, 맞는 카드 뭉치가 없다면 그 즉시 No를 반환하는 함수이다.

만약 반복문을 다 돌고서도 끝나지 않는다면 Yes를 반환하도록 하였다.

 

'2차 공부 > 알고리즘' 카테고리의 다른 글

24.06.13 기사단원의 무기  (0) 2024.06.13
소수 만들기  (0) 2024.06.12
콜라문제  (0) 2024.06.05
시저암호  (1) 2024.06.04
문자열 다루기 기본  (0) 2024.05.31