728x90
반응형

2021.06.12

문제명 : 찾아라 프로그래밍 마에스터 - 폰켓몬

사용언어 : Javascript

개발 시간 : 10분

 

 

코딩테스트 연습 - 폰켓몬

당신은 폰켓몬을 잡기 위한 오랜 여행 끝에, 홍 박사님의 연구실에 도착했습니다. 홍 박사님은 당신에게 자신의 연구실에 있는 총 N 마리의 폰켓몬 중에서 N/2마리를 가져가도 좋다고 했습니다.

programmers.co.kr

 

📋 문제 설명

주어진 폰켓몬중 N/2마리를 고를 때 선택할 수 있는 폰켓몬 종류의 최댓값을 구하는 문제입니다

주어지는 폰켓몬은 항상 짝수 개수이므로 N/2는 딱 떨어지는 수입니다

 

📢 입출력 예

nums 배열 안에 값은 각각의 폰켓몬을 의미합니다. '1'이라는 폰켓몬, '2'라는 폰켓몬 등..

예제 2를 보면, [3,3,3,2,2,4] 이므로 가져갈 수 있는 폰켓몬의 개수(N/2)는 3마리(6/2)입니다

3마리를 가져갈 수 있는 방법 중 가장 다양하게 가져가는 방법은 2,3,4라는 폰켓몬을 한 마리씩 가져가는 것입니다

따라서 3이 답입니다

 

즉,

  1. nums배열 안에 중복되는 폰켓몬들을 제거한 후
  2. 중복 제거한 배열의 개수 >= N/2 라면 답은 N/2
  3. 중복 제거한 배열의 개수  <  N/2 라면 답은 중복 제거한 배열의 개수가 되는 것입니다

 

🔑 문제 풀이

function solution(nums) {
    var answer = 0;
    var cnt = nums.length / 2;
    
    // 중복 제거
    var arr = nums.filter((element, index) => {
        return nums.indexOf(element) === index;
    });
    
    if(arr.length >= cnt){
        answer = cnt;
    }else{
        answer = arr.length;
    }
    
    return answer;
}

 

728x90
반응형
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
반응형

티스토리 글 작성 시 템플릿 양식을 미리 만들어 사용할 수 있습니다

 

서식 만들기

 

1. 환경설정 화면에서 서식관리 메뉴에 들어가 서식 쓰기를 클릭 

 

 

 

728x90

2. 서식 작성

저의 경우에는 개발일지를 올리기 위해 필요한 틀을 만들었습니다

 

 

 

3. 서식이 등록되었습니다

 

 

 

등록한 서식 불러오기

 

1. 글쓰기 화면에서 더보기 메뉴안에 서식 클릭

 

 

 

2. 등록된 서식 목록이 보입니다

 

 

 

3. 서식 클릭시 등록해둔 서식이 나타납니다

 

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