스터디 기록10

유아현·2022년 11월 28일
0

Study

목록 보기
11/27
post-thumbnail

1. [1차] 다트 게임

function solution(dartResult) {

    // 1. 숫자일 경우
    // 2. 보너스일 경우
    // 3. 옵션일 경우
    
    let score = 0;
    let bonus = [];
    
    for(let i = 0 ; i < dartResult.length ; i++){
        // 10점일 때
        // 전 인덱스가 1이면 10임 그러면
        // true면 10 넣어주고 false면 dartResult[i]
        if(!isNaN(dartResult[i])){
           score = Number(dartResult[i-1]) === 1 ? 10 : Number(dartResult[i]);
           } else if(dartResult[i] === "S"){ // 보너스 S일 때
               bonus.push(score);
           } else if(dartResult[i] === "D"){ // 보너스 D일 때
               bonus.push(Math.pow(score, 2));
           } else if(dartResult[i] === "T"){ // 보너스 T일 때
               bonus.push(Math.pow(score, 3));
           } else if(dartResult[i] === "*"){ // 옵션 *일 때
               bonus[bonus.length-2] = bonus[bonus.length-2] * 2; // 기회는 3번이기 때문에 두번째나 세번째 기회일 때 앞에 점수를 중첩으로 *2 해 줘야됨
               bonus[bonus.length-1] = bonus[bonus.length-1] * 2;
           } else if(dartResult[i] === "#"){ // 옵션 #일 때(해당 점수 마이너스)
               bonus[bonus.length-1] = -1 * bonus[bonus.length-1];
           }
    }
    
    let result = 0;
    result = bonus.reduce((a, c) =>{
        return a + c;
    }, 0);
    
    return result;
}

내가 풀었던 방식... 다트 게임 결과 한 문자씩 돌면서 숫자/보너스/옵션일 때를 하나씩 if문으로 돌려 주었다 인덱스 주는 부분은 아직도 헷갈림....ㅎ 그리고 10일 경우에 대해서 어떻게 설정해 줘야 될지 많이 고민했던 문제! 구글링 참고해서 풀었다... 따흑~

/*
    다트 기회 3번
    S,D,T라는 영역이 존재, s = 1제곱 d = 2제곱 t = 3제곱
    *, #라는 옵션이 존재 * = 전에 얻은 점수를 2배로 만듦, # = 마이너스2배
    총 연산값을 리턴하기
*/
function solution(dartResult) {
    var numArr = [];
    var number = 0;
    var answer = 0;
    for (var i=0; i<dartResult.length; i++) {

        // 점수
        if (/[0-9]/.test(dartResult[i])) {
            if (dartResult[i] == 1 && dartResult[i+1] == 0) {
                number = 10;
                i++;
            } else {
                number = dartResult[i];
            }
        }

        // 보너스
        if (dartResult[i] == 'S') numArr.push(number ** 1);
        if (dartResult[i] == 'D') numArr.push(number ** 2);
        if (dartResult[i] == 'T') numArr.push(number ** 3);

        // 옵션
        if (dartResult[i] == '#') numArr[numArr.length-1] *= -1;
        if (dartResult[i] == '*') {
            numArr[numArr.length-1] *= 2;
            numArr[numArr.length-2] *= 2;
        }

    }

    // 계산
    numArr.map((item) => {
        answer += Number(item);
    })
    return answer;

인상 깊었던 동원님 코드 조건을 걸어 줄 때 .test를 쓰셔서 신기했다!! 그럼 바아로 뭔지 알아 봐야지

RegExp.prototype.test()

  • 주어진 문자열이 정규 표현식이 맞는지 판별하여 여부를 true/false로 반환

저 코드에서는 0-9까지 숫자인지 판별하는 조건으로 .test()를 쓰셔서 신기했다

2. 콜라 문제

function solution(a, b, n) {
        
        let get = 0; // 마트에서 받은 콜라의 수
        let remain = n; // 남은 콜라의 수(가진 빈 병의 수)
        let result = 0; // 받은 콜라의 합계를 구하기 위한 변수
    
        // 보유 중인 빈 병(남은 콜라)이 a개 미만일 때까지 반복
        while(remain >= a){
        // 1. 빈 병을 주고 콜라를 받는다
        // (내가 가진 빈 병 / 마트에 줘야 되는 수) * 받는 콜라의 수(받는 콜라의 수가 1이 아닐 수도 있음)
        get = Math.floor(remain / a) * b;
        // 2. 남은 콜라를 구한다
        // 남은 콜라(내가 가진 빈 병): 받은 콜라 + 아까 안 주고 남은 콜라
        remain = get + (remain % a);
        // 3. 받은 콜라 누적
        result += get;
        }
    
        return result;
}

남은 콜라가 a 미만이라고 해서 조건 줄 때 살짝 헷갈렸던 문제..... 그림으로 그려서 어떻게 풀지 이해하면서 하니까 나름 잘 풀렸다

function solution(a, b, n) {
    // 돌려받는 병 수 :  전체에서 a만큼 나눈 몫 * b
    // 다음 전체 병 수 : 이전 병수의 나머지 + 이전 돌려 받은 병 수 
    // 종료 조건 : 더 이상 돌려받을 병이 없을 때
    let answer = 0;
    const startNum = n;
    const divider = a;
    const giveNum = b;
    let tempNum = startNum;

    while(true){
        const cashback = Math.floor(tempNum / divider) * giveNum;
        console.log(cashback);
        if(cashback === 0){
            break;
        }

        answer += cashback;
        tempNum = cashback + tempNum % divider;

    }

    return answer;
}

나랑 비슷하지만 while에 true로만 주시고 break로 걸어두신 방법도 좋아보여서 가지고 옴...

3. 로또의 최고 순위와 최저 순위

function solution(lottos, win_nums) {
    
    const ranking = [6, 5, 4, 3, 2, 1];
    let result = [];
    
    // 맞힌 번호로만 구성된 배열의 길이를 구해서 맞힌 번호의 수를 구한다
    let same = lottos.filter( ele => win_nums.includes(ele)).length;
    
    // 0으로만 구성된 배열의 길이를 구해서 0의 개수를 구한다
    let zero = lottos.filter( ele => ele === 0).length;
    
    // 최고 순위 구하기(최고 순위는 내가 맞힌 번호의 수 + 0의 개수)
    let best = same + zero
    best === 1 || best === 0 ? result.push(ranking[0]) : result.push(ranking[best-1])
    
    // 최저 순위 구하기
    same === 1 || same === 0 ? result.push(ranking[0]) : result.push(ranking[same-1]);
        
    return result;
}

ranking이라는 배열에서 6 6 5 4 3 2 1 주면 됐는데 6등이 2개일 때라 인덱스 설정하는 게 살짝 까다로웠던 문제, 인덱스 번호가 곧 맞힌 개수로 생각하긴 했지만 6 6으로 줄 생각을 못했어서... 코드 리뷰하면서 아쉬움이 남았다 아!!!! 6 6으로 줄걸,,, 하고 ㅋㅋㅋ 그래도 인덱스값 넣는 연습했다치고 ㅎㅎ

const LOTTORANK = new Map([[6,1],[5,2],[4,3],[3,4],[2,5]]);
function solution(lottos, win_nums) {
    // 가려진 부분을 0으로 표시
    // 최고순위 0으로 된 부분만큼 다 맞는 것
    // 최저순위 0으로 된 부분만큼 다 틀리는 것
    // 기존의 것 카운트 하고 0으로 된 것 +, - 
    // 순위 찾기
    const answer = [];
    const baseCountNum = lottos.filter(value=>isMatch(value,win_nums)).length;
    const zeroCount = lottos.filter(isZero).length;
    console.log(baseCountNum, zeroCount);
    // a ?? b
    //a가 null도 아니고 undefined도 아니면 a
    //그 외의 경우는 b
    answer.push(LOTTORANK.get(baseCountNum + zeroCount) ?? 6);
    answer.push(LOTTORANK.get(baseCountNum) ?? 6);
    return answer;
}
function isMatch(value, win_nums){
    return win_nums.includes(value);
}

function isZero(value){
    return value === 0;
}

/*
const rank = [6, 6, 5, 4, 3, 2, 1]; 이런식으로 할 수도 있음.
*/

answer.push(LOTTORANK.get(baseCountNum + zeroCount) ?? 6);
의 ??을 굉장히 오랜만에 봐서.... 아 저런게 있었지... 한 코드

??(논리 연산자)를 기준으로 왼쪽 피연산자가 null 또는 undefined나 falsy한 값일 때 오른쪽 피연산자를 반환하고, 그렇지 않을 때는 왼쪽의 피연산자를 반환한다.

0개의 댓글