Bin's Blog

[프로그래머스] Level2 - 혼자 놀기의 달인(Javascript) 본문

Algorithm

[프로그래머스] Level2 - 혼자 놀기의 달인(Javascript)

hotIce 2023. 8. 23. 17:21
728x90
 

프로그래머스

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

programmers.co.kr

📝 문제 요약

1️⃣ 카드는 1 ~ 100까지의 숫자가 존재, 준비된 상자에 카드를 한 장씩 넣고 상자를 무작위를 섞어 일렬로 나열했다.

2️⃣ 나열된 순서에 따라 1번부터 순차적으로 증가한다. 

3️⃣ 임의 상자를 열어 카드를 확인하고 또 1번에 해당하는 상자를 열어 확인한다. 열어야 하는 상자가 이미 열려있을 대까지 반복한다.

4️⃣ 1번 상자 제외하고 남는 상자가 없으면 게임은 종료되고 점수는 0점이다. 

5️⃣ 그렇지 않으면 1번 상자 제외하고 남는 상자 있으면 1번 방식으로 이미 열려있는 상자를 만날 때가지 상자를 연다.

6️⃣ 1번 2번 상자의 수를 곱한게 정답이 된다. 게임에서 얻을 수 있는 최고점수를 구해라.

 

✅ 정답 코드

function solution(cards) {
    let answer = [];
    // 방문 표시 
    let visited = Array.from(Array(cards.length + 1).fill(false));


    for (let v of cards) {
        // 만약하지 방문하지 않는 곳이면
        if (!visited[v]) {
            // 빈 리스트 생성
            let temp = [];
            // temp에 방문하지 않았으면
            while (!temp.includes(v)) {
                // temp에 넣어준다.
                temp.push(v)
                // cards[v-1] 한 원소가 다음 확인할 카드 
                v = cards[v-1];

                // 방문표시 
                visited[v] = true;
            }
            // 상자의 수를 담는다
            answer.push(temp.length);
        }
    }

    // 1번 상자 그룹을 제외하고 남는 그룹 즉 1번 상자만 있을때는 0이다. 
    if (answer[0] == cards.length) {
        return 0
    // 내림차순 정렬으로 가장 점수가 큰 2개의 수를 뽑는다.     
    } else {
        answer.sort((a, b) => b - a); 
        return answer[0] * answer[1]
    }

}

 

🖨️ 실행결과

 

📔느낀점

👉 카드와 관련된 문제에서 중요한건 패턴을 찾는 연습을 해야 한다. 생각보다 이런 유형은 패턴을 찾으면 쉽다. 

 

728x90