JavaScript - 프로그래머스 레벨 : 1(13) - ORDER BY '정답률'

먹보·2023년 1월 25일
0

1. 푸드 파이트 대회

문제 : 수웅이는 매달 주어진 음식을 빨리 먹는 푸드 파이트 대회를 개최합니다. 이 대회에서 선수들은 1대 1로 대결하며, 매 대결마다 음식의 종류와 양이 바뀝니다. 대결은 준비된 음식들을 일렬로 배치한 뒤, 한 선수는 제일 왼쪽에 있는 음식부터 오른쪽으로, 다른 선수는 제일 오른쪽에 있는 음식부터 왼쪽으로 순서대로 먹는 방식으로 진행됩니다. 중앙에는 물을 배치하고, 물을 먼저 먹는 선수가 승리하게 됩니다.

이때, 대회의 공정성을 위해 두 선수가 먹는 음식의 종류와 양이 같아야 하며, 음식을 먹는 순서도 같아야 합니다. 또한, 이번 대회부터는 칼로리가 낮은 음식을 먼저 먹을 수 있게 배치하여 선수들이 음식을 더 잘 먹을 수 있게 하려고 합니다. 이번 대회를 위해 수웅이는 음식을 주문했는데, 대회의 조건을 고려하지 않고 음식을 주문하여 몇 개의 음식은 대회에 사용하지 못하게 되었습니다.

예를 들어, 3가지의 음식이 준비되어 있으며, 칼로리가 적은 순서대로 1번 음식을 3개, 2번 음식을 4개, 3번 음식을 6개 준비했으며, 물을 편의상 0번 음식이라고 칭한다면, 두 선수는 1번 음식 1개, 2번 음식 2개, 3번 음식 3개씩을 먹게 되므로 음식의 배치는 "1223330333221"이 됩니다. 따라서 1번 음식 1개는 대회에 사용하지 못합니다.

수웅이가 준비한 음식의 양을 칼로리가 적은 순서대로 나타내는 정수 배열 food가 주어졌을 때, 대회를 위한 음식의 배치를 나타내는 문자열을 return 하는 solution 함수를 완성해주세요.

function solution(food){
  const foodForContest = [];
  const numOfPrepFood = [];
  const table = [];
  for (let i = 1; i < food.length ; i++){
    let num = Math.floor(food[i]/2)
    if(num > 0){
      foodForContest.push(i)
      numOfPrepFood.push(num)
    }
  }
  for (let j = 0 ; j < foodForContest.length ; j++){
    for (let k = 1 ; k <= numOfPrepFood[j] ; k++){
      table.push(foodForContest[j])
    }
  }
  return [...table,0,...table.reverse()].join("")
}

🗒️코멘트 : NULL

2. 실패율

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

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

실패율은 다음과 같이 정의한다.
스테이지에 도달했으나 아직 클리어하지 못한 플레이어의 수 / 스테이지에 도달한 플레이어 수
전체 스테이지의 개수 N, 게임을 이용하는 사용자가 현재 멈춰있는 스테이지의 번호가 담긴 배열 stages가 매개변수로 주어질 때, 실패율이 높은 스테이지부터 내림차순으로 스테이지의 번호가 담겨있는 배열을 return 하도록 solution 함수를 완성하라.

function solution(N,stages){
  const failureRate = new Map();
  for (let i = 1 ; i <= N ; i++){
    let num = 0;
    let deno = 0;
    for (let j = 0 ; j < stages.length ; j++){
      i === stages[j] ? num++ : null
      stages[j] >= i ? deno++ : null
    }
    failureRate.set(i, num/deno)
  }
  return Array.from(failureRate.keys()).sort((a, b) => failureRate.get(b) - failureRate.get(a));
}

🗒️코멘트 : 로직은 바로 떠올랐으나, Map 함수의 숙련도 부족으로 약간 오래 걸렸다. 그래도....기분 좋다..프로그래머스의 다른 코드들과 비교한 결과..성능이 최대 5배 좋다!!
1. Map 자료구조의 유용성 증명!

3. 다트게임

문제 : 카카오톡 게임별의 하반기 신규 서비스로 다트 게임을 출시하기로 했다. 다트 게임은 다트판에 다트를 세 차례 던져 그 점수의 합계로 실력을 겨루는 게임으로, 모두가 간단히 즐길 수 있다.
갓 입사한 무지는 코딩 실력을 인정받아 게임의 핵심 부분인 점수 계산 로직을 맡게 되었다. 다트 게임의 점수 계산 로직은 아래와 같다.

0~10의 정수와 문자 S, D, T, *, #로 구성된 문자열이 입력될 시 총점수를 반환하는 함수를 작성하라.

function solution(dartResult) {
    let answer = [];
    let make10 = 0;
    
    for(let i=0; i<dartResult.length; i++) {
        if(dartResult[i].match(/[0-9]/)) {
            if(dartResult[i]==='1' && dartResult[i+1]==='0') {
                make10=10;
                i++;
            }
            else tmp=dartResult[i];
        }

        else if(dartResult[i] === 'S') answer.push(Math.pow(make10, 1));
        else if(dartResult[i] === 'D') answer.push(Math.pow(make10, 2));
        else if(dartResult[i] === 'T') answer.push(Math.pow(make10, 3));
        
        else if(dartResult[i] ==='*') {
            answer[answer.length-1] *= 2;
            answer[answer.length-2] *= 2;
        }
        else if(dartResult[i] === '#') answer[answer.length-1] *= (-1);
    }

    return answer.reduce((acc, v) => acc+v);
}

// 밑에 건 실패...
function solution(dartResult) {
    let answer = 0;
    const bonus = {
        S : 1,
        D : 2,
        T : 3,
    };
    const option = ['*','#']
    for (let i = 0 ; i < dartResult.length ; i++){
        if(Object.hasOwn(bonus,dartResult[i])){
            answer += Math.pow(Number(dartResult[i-1]),bonus[dartResult[i]])
        }
        if(dartResult[i] == option[0]){
            answer = (answer * 2)
        } else if (dartResult[i] == option[1]){
            answer -= (Math.pow(Number(dartResult[i-1]),bonus[dartResult[i]]) * -2)
        }
    }
    return answer;
}

🗒️코멘트 : 음..마음에 들지 않는다..처음에는 밑에 방법으로 어느정도 커버가 되어서..진행을 했다가..나중에는..'10'도 처리를 해줘야 된다는 것을 깨닫고..밑에 것을 수정하지 못하고..위에 것으로 진행을 했다..아 밑에 것이 더 마음에 드는데..어찌 방법이 없을까?

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글