ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 2021_12_21 2019카카오 코딩테스트 문제2, 3
    IT/js 2021. 12. 21. 16:39

    2. 실패율

    슈퍼 게임 개발자 오렐리는 큰 고민에 빠졌다. 그녀가 만든 프랜즈 오천성이 대성공을 거뒀지만, 요즘 신규 사용자의 수가 급감한 것이다. 원인은 신규 사용자와 기존 사용자 사이에 스테이지 차이가 너무 큰 것이 문제였다.

    이 문제를 어떻게 할까 고민 한 그녀는 동적으로 게임 시간을 늘려서 난이도를 조절하기로 했다. 역시 슈퍼 개발자라 대부분의 로직은 쉽게 구현했지만, 실패율을 구하는 부분에서 위기에 빠지고 말았다. 오렐리를 위해 실패율을 구하는 코드를 완성하라.

    • 실패율은 다음과 같이 정의한다.
      • 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

    전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

    제한사항

    • 스테이지의 개수 N은 1 이상 500 이하의 자연수이다.
    • stages의 길이는 1 이상 200,000 이하이다.
    • stages에는 1 이상 N + 1 이하의 자연수가 담겨있다.
      • 각 자연수는 사용자가 현재 도전 중인 스테이지의 번호를 나타낸다.
      • 단, N + 1 은 마지막 스테이지(N 번째 스테이지) 까지 클리어 한 사용자를 나타낸다.
    • 만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다.
    • 스테이지에 도달한 유저가 없는 경우 해당 스테이지의 실패율은 0 으로 정의한다.

    입출력 예

    Nstagesresult

    5 [2, 1, 2, 6, 2, 4, 3, 3] [3,4,2,1,5]
    4 [4,4,4,4,4] [4,1,2,3]

    입출력 예 설명

    입출력 예 #1

    1번 스테이지에는 총 8명의 사용자가 도전했으며, 이 중 1명의 사용자가 아직 클리어하지 못했다. 따라서 1번 스테이지의 실패율은 다음과 같다.

    • 1번 스테이지 실패율 : 1/8

    2번 스테이지에는 총 7명의 사용자가 도전했으며, 이 중 3명의 사용자가 아직 클리어하지 못했다. 따라서 2번 스테이지의 실패율은 다음과 같다.

    • 2번 스테이지 실패율 : 3/7

    마찬가지로 나머지 스테이지의 실패율은 다음과 같다.

    • 3번 스테이지 실패율 : 2/4
    • 4번 스테이지 실패율 : 1/2
    • 5번 스테이지 실패율 : 0/1

    각 스테이지의 번호를 실패율의 내림차순으로 정렬하면 다음과 같다.

    • [3,4,2,1,5]

    입출력 예 #2

    모든 사용자가 마지막 스테이지에 있으므로 4번 스테이지의 실패율은 1이며 나머지 스테이지의 실패율은 0이다.

    • [4,1,2,3]

    문제 풀이

    문제를 읽어보면 알 수 있듯이 이 문제는 정렬을 이용해서 풀 수 있습니다.
    먼저 주어진 배열의 길이를 이용하여 전체 사용자 수를 구하고, stages 를 순회하며 각 스테이지에 몇 명의 사용자가 도달했는지 세줍니다. 이렇게 만들어둔 배열(각 스테이지별 사용자 수가 들어있는)을 순회하면서 stages 를 참고하여 스테이지별 실패율을 계산합니다. 이때, 스테이지에 도달한 사용자가 0명인 경우 예외 처리를 해야 합니다. 스테이지별 실패율을 구했다면, 각 스테이지 번호와 묶어서 실패율 내림차순으로 정렬합니다. 실패율이 같은 경우는 스테이지 번호가 작은 것을 먼저 오도록 정렬하면 됩니다.

     

    실패율 == 아직 클리어 못한 플레이어 수 / 도달한 플레이어 수

    전체 스테이지의 개수 N

    스테이지의 번호가 담긴 배열 stages 가 매개변수

     

    실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수

    만약 실패율이 같은 스테이지가 있다면 작은 번호의 스테이지가 먼저 오도록 하면 된다

    (작은 번호가 먼저 -> 오름차순)

     

    N stage

    N stage result
    5 2, 1, 2, 6, 2, 4, 3, 3 3, 4, 2, 1, 5
    4 4, 4, 4, 4, 4 4, 1, 2, 3

    스테이지에 도달 한 사람의 수

    1stage === 1

    2stage === 3

    3stage === 2

    4stage === 1

    5stage === 0

     

    스테이지에 도달 한 사람의 수

    1stage === 1  // 8명 중에 1명 //  // 12.5

    2stage === 3  // 7명 중에 3명 // 3/(8-1)

    3stage === 2  // 4명 중 2명    // 2/(7-3)

    4stage === 1  // 2명 중 1명   // 1(4-2)

    5stage === 0 // 1명 중 0명     // 0/(2-1)

    ////////////////////////// step 1 ////////////////////
    [2, 1, 2, 6, 2, 4, 3, 3].filter((user) => uesr === 3);
    // (2) [3, 3]
    
    
    function solution(스테이지수, stages){
    	let 실패율 = [];
        let 유저수 = stages.length;
        
        for (let i = 1; i <= 스테이지수; i++){
        	let 도달한사람수 = stages.filter({user) => user === i).length;
            // 도달한사람수
            실패율.push(도달한사람수);
            
        }
        
        return 실패율;
    }
    
    solution(5, [2, 1,2, 6, 2, 4, 3, 3]);
    
    ////////////////////////// step 2 ////////////////////
    
    function solution(스테이지수, stages){
    	let 실패율 = [];
        let 유저수 = stages.length;
        
        for (let i = 1; i <= 스테이지수; i++){
        	let 도달한사람수 = stages.filter({user) => user === i).length;
            let 확률 = 도달한사람수/유저수
            유저수 -= 도달한사람수
            실패율.push(stage:i, 확률:확률);
            
        }
        
        return 실패율;
    }
    
    solution(5, [2, 1,2, 6, 2, 4, 3, 3]);
    
    ////////////////////////// step 3 정렬 ////////////////////
    
    function solution(스테이지수, stages){
    	let 실패율 = [];
        let 유저수 = stages.length;
        
        for (let i = 1; i <= 스테이지수; i++) {
            let 도달한사람수 = stages.filter((user) => user === i).length;
            let 확률 = 도달한사람수/유저수;
            유저수 -= 도달한사람수;
            실패율.push({stage : i, 확률 : 확률});
        }
    
        // sort의 내림차순
        // b - a
        // sort의 오름차순
        // a - b
        실패율.sort((a, b) => {
            if (a.확률 === b.확률){
                return a.stage - b.stage;
            } else {
                return b.확률 - a.확률;
            }
        });
        
        return 실패율.map(object => object.stage);
    }
    
    solution(5, [2, 1, 2, 6, 2, 4, 3, 3]);

     

     

    // 3. 20년도
    // 링크 : https://tech.kakao.com/2019/10/02/kakao-blind-recruitment-2020-round1/
    // aabbaccc -> a, a, b, b, a, c, c, c -> 2a2ba3c
    // aabbaccc -> aa, bb, ac, cc -> aabbaccc
    // aabbaccc -> aab, bac, cc -> aabbaccc
    // aabbaccc -> aabb, accc -> aabbaccc
    
    // 'aabbaccc'.match(/[a-z]{1}/g);
    // 'aabbaccc'.match(/[a-z]{2}/g);
    
    // step 1
    function solution(s) {
        let answer = s.length;
        let len = s.length;
    
        for (let i = 1; i < len/2 + 1; i++) {
            const re = new RegExp(`[a-z]{${i}}`, 'g');
            console.log(re);
            let 잘린문자열 = s.match(re);
            console.log(잘린문자열);
        }
        return answer;
    }
    
    solution('aabbaccc');
    
    
    // step 2
    function solution(s) {
        var answer = s.length;
        let len = s.length;
    
        if (len === 1) return 1;
        
        for(let i = 1; i <= len/2 + 1; i++){ //자르는 크기
            const re = new RegExp(`[a-z]{${i}}`, 'g');
            console.log(re)
            let 잘린문자열 = s.match(re);
            console.log(잘린문자열)
            압축문자열 = ''
            let count = 1 //2a2b3c 여기서 앞에 나오는 숫자
            for (j = 0 ; j < 잘린문자열.length; j++) {
                if (잘린문자열[j] === 잘린문자열[j+1]) {
                    //aa -> 2a // 뒤에 값을 봐서 같은지!
                    count += 1;
                } else if (count === 1) {
                    압축문자열 += `${잘린문자열[j]}`;
                } else if (count > 1) {
                    // 왜 1보다 크냐면 aa가 1a1a가 아니기 때문!
                    압축문자열 += `${count}${잘린문자열[j]}`;
                    // 앞 문자열과 뒤 문자열이 다른 경우는
                    count = 1;
                }
                console.log(압축문자열);
            }
            console.log(압축문자열);
        }
        return answer;
    }
    
    solution("aabbaccc")
    solution("aabbaabbaccc") // accc를 추가하지 못하는 문제 발생
    
    
    // step 3
    function solution(s) {
        var answer = s.length;
        let len = s.length;
    
        if (len === 1) return 1;
        
        for(let i = 1; i <= len/2 + 1; i++){ //자르는 크기
            const re = new RegExp(`[a-z]{${i}}`, 'g');
            // console.log(re)
            let 잘린문자열 = s.match(re);
            // console.log(잘린문자열)
            압축문자열 = ''
            let count = 1 //2a2b3c 여기서 앞에 나오는 숫자
            for (j = 0 ; j < 잘린문자열.length; j++) {
                if (잘린문자열[j] === 잘린문자열[j+1]) {
                    //aa -> 2a // 뒤에 값을 봐서 같은지!
                    count += 1;
                } else if (count === 1) {
                    압축문자열 += `${잘린문자열[j]}`;
                } else if (count > 1) {
                    // 왜 1보다 크냐면 aa가 1a1a가 아니기 때문!
                    압축문자열 += `${count}${잘린문자열[j]}`;
                    // 앞 문자열과 뒤 문자열이 다른 경우는
                    count = 1;
                }
                // console.log(압축문자열);
            }
            if (len % i !== 0){
                압축문자열 += s.slice(-len % i)
            }
            // console.log(압축문자열);
            answer = Math.min(answer, 압축문자열.length)
        }
        return answer;
    }
    
    solution("aabbaccc")
    solution("aabbaabbaccc") // accc를 추가하지 못하는 문제 발생
    
    
    // 번외
    // 입력 예시: aaabbcccccca
    // 출력 예시: a3b2c6a1
    
    let s = 'aaabbcccccca';
    let 압축 = '';
    let count = 1
    
    for (let i = 0; i < s.length; i++) {
        if (s[i] === s[i + 1]){
                    count += 1
        } else if (count >= 1) {
            압축 += `${s[i]}${count}`;
            count = 1;
        }
    }
    
    console.log(압축);
    
    
    
    // why?
    // for (const index in s) {
    //     console.log(s[index] === s[index+1])
    //     console.log(s[index], s[index+1])
    //     // if (s[index] === s[index + 1]){
    //     //     count += 1
    //     // } else if (count >= 1) {
    //     //     압축 += `${s[index]}${count}`;
    //     //     count = 1;
    //     // }
    // }
Designed by Tistory.