728x90
반응형

2021.05.29

문제명 : 2019 KAKAO BLIND RECRUITMENT - 실패율

사용언어 : Javascript

개발 시간 : 90분

 

 

 

코딩테스트 연습 - 실패율

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

programmers.co.kr

 

📋 문제 설명

실패율 = 스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수

 

📢 입출력 예

예시 1을 보면, 최종단계(N)는 5단계이고, stages배열 [2, 1, 2, 6, 2, 4, 3, 3]입니다.

stages배열의 각각은 개개인이 현재 위치해있는 단계를 의미합니다.

 

따라서 stages 배열의 크기만큼 인원(8명)이 있고,

  • 1단계에 머무르고 있는 사람은 [2, 1, 2, 6, 2, 4, 3, 3] 한 명이므로 1단계 실패율 : 1/8 (=0.125)
  • 2단계에 머무르고 있는 사람은 2단계 이상 올라온 사람 중 [22, 6, 2, 4, 3, 3] 세명이므로 2단계 실패율 : 3/7 (=0.42)
  • 3단계에 머무르고 있는 사람은 3단계 이상 올라온 사람 중 [6, 4, 33] 세명이므로 3단계 실패율 : 2/4 (=0.5)

이런식으로 반복되면 실패율이 높은(큰) 단계는 3단계(0.5)→4단계(0.5)→2단계(0.42)→1단계(0.125)→5단계(0) 순입니다.

 

따라서 정답은 [3,4,2,1,5]입니다.

 

 

🔑 문제 풀이

function solution(N, stages) {
    var answer = [];
    var fail_arr = [];
    var total = stages.length;

    for(var i=1; i<=N; i++){
        
        var cnt = 0;
        for(var j=0; j<stages.length; j++){
            if(i == stages[j]){
                cnt++;                
            }
        }        
        
        // 실패율(per)순으로 정렬시키기 위해 json형태로 push
        fail_arr.push({per:cnt/total, idx:i});
        total -= cnt;
    }
    
    fail_arr.sort(function(a, b) { return b["per"] - a["per"]; });
    
    for(var i=0; i<fail_arr.length; i++){
        answer.push(fail_arr[i].idx);
    }
    
    return answer;
}

 

 

🔔 새로 알게 된 점

16번 라인 : fail_arr.push({per:cnt/total, idx:i}); 

딕셔너리로 관리할 수 있다.

 

728x90
반응형
728x90
반응형

2021.05.29

문제명 : 2019 카카오 개발자 겨울 인턴십 - 크레인 인형뽑기 게임

사용언어 : Javascript

개발 시간 : 90분

 

 

코딩테스트 연습 - 크레인 인형뽑기 게임

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

programmers.co.kr

 

 

📋 문제 설명

NxN행렬에서 인형을 뽑아 쌓을 때 중복되어 없어지는 인형의 갯수를 구하는 문제입니다

 

 

📢 입출력 예

 

 

🔑 문제 풀이

예시의 board 배열을 테이블 형식으로 표현하면 다음과 같습니다.

각각의 숫자를 '1'이라는 인형, '2'라는 인형이라고 생각하면 이해가 빠를 것입니다.

단 '0'은 비어있는 공간이라고 생각하는 것입니다.

 

0 0 0 0 0
0 0 1 0 3
0 2 5 0 1
4 2 4 4 2
3 5 1 3 1

 

 

 

moves [1,5,3,5,1,2,1,4]는 위 테이블 하단에 해당하는 숫자로,

⁕ 첫 번째 1의 경우

0은 비어있는 공간이라고 생각하기로 했기 때문에 크레인이 지나치므로 '4'라는 인형이 뽑힙니다.

'4'라는 인형이 뽑혔으므로 그 자리는 공백이 됩니다  

 

 

 

⁕ 두번째 5의 경우

마찬가지로 0이라는 빈 공간 지나치면 크레인은 '3'이라는 인형을 뽑고 그 자리는 공백으로 바뀝니다.

 

 

이런 식으로 뽑으면 순서대로 4 → 3 →  113 → 2 → '없음' → 4라는 인형이 뽑힙니다.

중복이 되는 경우 인형은 터진다고 했으므로, 4 → 3 →  1 → 1 에서 '1'이라는 인형 두 개는 터지고,

4 → 3 → 3 에서 '3'이라는 인형 두 개가 터집니다.

그 후에는 더이상 중복이 발생하지 않으므로 종료됩니다.

따라서 4개의 인형이 터지게 됩니다.

 

 

이를 코드로 변경하면,

function solution(board, moves) {
    var answer = 0;
    var res_arr = new Array();
    var chk = "N";

    var y = 0;
    for(var i=0; i<moves.length; i++){
        if(chk == "N"){
            y = i;    
        }
        
        var x = moves[i] - 1; 
        
        for(var j=0; j<board.length; j++){
        	// 빈 공간이 아니라면
            if(board[j][x] != 0){ 
                
                // 해당 인형을 넣기
                res_arr.push(board[j][x]); 
                
                // 뽑힌 인형 자리는 빈 공간(0)으로 변경
                board[j][x] = 0;	
                
                // 중복 발생시
                if((res_arr[y] == res_arr[y-1])){ 
                    
                    // 터지는 인형은 기존것과 새로 뽑힌것 : 총2개
                    answer = answer + 2;	
                    
                    // 기존것 제거(터지기)
                    res_arr.pop();	
                    // 새로뽑힌 것 제거(터지기)
                    res_arr.pop();  
                    
                    y--;
                    chk = "Y";
                }else{
                     y++;
                }
                
                break;
            }
        }        
    }
    
    return answer;
}

 

728x90
반응형
728x90
반응형

2021.05.29

문제명 : Summer/Winter Coding(~2018) - 예산

사용언어 : Javascript

개발 시간 : 30분

 

코딩테스트 연습 - 예산

S사에서는 각 부서에 필요한 물품을 지원해 주기 위해 부서별로 물품을 구매하는데 필요한 금액을 조사했습니다. 그러나, 전체 예산이 정해져 있기 때문에 모든 부서의 물품을 구매해 줄 수는

programmers.co.kr

 

📋 문제 설명

이 문제의 핵심은 정해진 예산으로 최대 몇 개의 부서의 물품을 구매할 수 있는지입니다.

 

 

📢 입출력 예

정해진 예산을 꼭 써야 하는 것은 아닌 것도 주의하면 좋을 것 같습니다.

 

 

🔑 문제 풀이

적은 금액부터 지원해주면 최대한 많은 부서의 물품을 구매할 수 있다

1. 부서 배열 d를 오름차순 정렬시키기

2. 적은 금액부터 금액 합치기 -> 합친 금액이 예산보다 많아지기 전까지만 합치기

3. 주어진 예산보다 많아질 시 break!

 

function solution(d, budget) {
    var answer = 0;
    var sum = 0;
    
    // 오름차순 정렬
    d = d.sort(function(a, b){ return a-b; });

    for(var i=0; i<d.length; i++){
        sum += d[i];
        
        // 주어진 예산보다 합이 적을때까지만 합치기
        if(sum <= budget){
            answer++;
        }else{
            break;
        }
    }
    
    return answer;
}

 

숫자 배열 오름차순 정렬 시, 문자로 인식하므로 주의하세요!

var arr = [1,2,100]

arr.sort(); 
// 결과 : [1,100,2]

arr.sort(function(a,b) {return a-b;});
// 결과 : [1,2,100]

 

 

🔔 새로 알게 된 점

1. 숫자 배열 정렬 시에는 문자로 인식하므로 sort(function(a,b) {return a-b;}); 사용하기

728x90
반응형

+ Recent posts