[알고리즘]프로그래머스 0단계 뽀개기(Day9)

HIHI JIN·2023년 1월 11일

알고리즘

목록 보기
4/29
post-thumbnail

Day 9

개미 군단

개미 군단이 사냥을 나가려고 합니다. 개미군단은 사냥감의 체력에 딱 맞는 병력을 데리고 나가려고 합니다. 장군개미는 5의 공격력을, 병정개미는 3의 공격력을 일개미는 1의 공격력을 가지고 있습니다. 예를 들어 체력 23의 여치를 사냥하려고 할 때, 일개미 23마리를 데리고 가도 되지만, 장군개미 네 마리와 병정개미 한 마리를 데리고 간다면 더 적은 병력으로 사냥할 수 있습니다. 사냥감의 체력 hp가 매개변수로 주어질 때, 사냥감의 체력에 딱 맞게 최소한의 병력을 구성하려면 몇 마리의 개미가 필요한지를 return하도록 solution 함수를 완성해주세요.

//내 코드
function solution(hp) {
    let king = Math.floor(hp / 5);
    let soldier = Math.floor((hp - king * 5) / 3);
    let worker = hp - (king * 5) - (soldier * 3);
    return (king + soldier + worker);
}
//hp 개미 몇마리
//장군 5, 병장 3, 일1
//23의 여치 사냥에 최소한의 병력 -> 장군4,병장1
//장군king = Math.floor(hp/5)
//병정soldier = Math.floor((hp-king*5) / 3) 전체hp에서 장군개미공격력빼기
//일worker = hp - (king * 5) - (soldier * 3) 전체 hp에서 장군개미와병정개미공격력빼기

//다른 사람 코드
function solution(hp) {
    return parseInt(hp/5) + parseInt((hp%5)/3) + parseInt((hp%5)%3)
}//나머지를 활용하고, parseInt를 사용해 소수점 무시

모스 부호(1)

머쓱이는 친구에게 모스부호를 이용한 편지를 받았습니다. 그냥은 읽을 수 없어 이를 해독하는 프로그램을 만들려고 합니다. 문자열 letter가 매개변수로 주어질 때, letter를 영어 소문자로 바꾼 문자열을 return 하도록 solution 함수를 완성해보세요.
모스부호는 다음과 같습니다.

morse = { 
    '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'
}
//내 코드
function solution(letter) {
    let answer = "";
    const obj = {'.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
    '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
    '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
    '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
    '-.--':'y','--..':'z'};
    const letterArr = letter.split(" ");
    for(let i of letterArr){
        for(let j in obj){
            if(i===j){
                answer+=obj[j];
            }
        }
    }
    return answer;
}
//모스부호인 문자letter을 영어소문자로 바꾼 문자열 리턴
//split("")으로 letter 배열을 만들고
//for반복문으로 letter의 요소들을 나열하고
//arr요소들도 이중반복문으로 나열하기
//letter의 요소와 arr[i]가 같다면, morse객체[i]값을 리턴

//다른 사람 코드
function solution(letter) {
    let morse = { 
        '.-':'a','-...':'b','-.-.':'c','-..':'d','.':'e','..-.':'f',
        '--.':'g','....':'h','..':'i','.---':'j','-.-':'k','.-..':'l',
        '--':'m','-.':'n','---':'o','.--.':'p','--.-':'q','.-.':'r',
        '...':'s','-':'t','..-':'u','...-':'v','.--':'w','-..-':'x',
        '-.--':'y','--..':'z'
    };
    return letter.split(' ').map(v=>morse[v]).join('');
}//map메서드를 활용해서 letter배열의 요소v를 morse[v]즉, morse[프로퍼티]=값
//모스부호에 맞는 값인 알파벳으로 letter배열요소들을 채우고 join메서드로 공백을 붙여 출력한다.

가위바위보

가위는 2 바위는 0 보는 5로 표현합니다. 가위 바위 보를 내는 순서대로 나타낸 문자열 rsp가 매개변수로 주어질 때, rsp에 저장된 가위 바위 보를 모두 이기는 경우를 순서대로 나타낸 문자열을 return하도록 solution 함수를 완성해보세요.

//내 코드
function solution(rsp) {
    var answer = '';
    let rspArr = rsp.split("");
    for(let i of rspArr){
        if(i==="2"){
            answer+="0";
        }else if(i==="0"){
            answer+="5";
        }else if(i==="5"){
            answer+="2";
        }
    }
    return answer;
}
//가위:2, 바위:0. 보:5
//문자열rsp는 순서대로 가위바위보 숫자를 뜻함. 모두 이기는 경우를 문자열로 리턴
//split("")으로 rsp을 배열로 만들고
//for문으로 rsp배열 요소 나열
//만약 rsp요소가 2면 answer+=0, 0이면 answer+=5, 5면 anser+=2

//다른 사람 코드
function solution(rsp) {
    let arr = {
        2: 0,
        0: 5,
        5: 2
    };
    var answer = [...rsp].map(v => arr[v]).join("");
    return answer;
}//객체를 사용하여 rsp요소를 객체[프로퍼티]=값으로 바꾸어 출력되게 하였다.

구슬을 나누는 경우의 수

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

//내 코드
function solution(balls, share) {
    let n = 1;
    let m = 1;
    let k = 1;
    for(let i=balls; i>0; i--){
        n *= i;
    }
    for(let j=(balls-share); j>0; j--){
        m *= j;
    }
    for(let l=share; l>0; l--){
        k *= l;
    }
    return Math.round(n/(m*k));
}
//가진 구슬 개수 : balls, 나누어 줄 구슬 개수 : share, 둘다 최대 30개
//balls개의 구슬 중에서 share개의 구슬을 구하는 가능한 모든 경우의 수 리턴
//서로 다른 balls중 share를 뽑는 경우의 수 공식
//balls! / (balls-share)! * share!
//!는 예로 5면 5*4*3*2*1 --되어야 한다.
//for반복문으로 i=balls 부터 i>0까지 i-- 그럼 5,4,3,2,1 let n*=i해서 다 곱하면 분자값은 n
//for반복문으로 j=(balls-share)부터 j>0까지 j-- let m*=j해서 다 곱하면 분모값중 하나인 m
//for반복문으로 l=share부터 l>0까지 l-- let k*=l해서 다 곱하면 분모값중 하나인 k
//return n/(m*k) Math.round메서드는 반올림메서드이다. 경우의 수를 구할 땐 반올림 메서드를 쓰는 거 기억하자!

//다른 사람 코드
const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)
function solution(balls, share) {
  return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}//삼항 연산자에사 변수 팩토리얼의 값 num이 0이면 1을 반환
//1이 아니면 팩토리얼(num) = num*num-1하라는 뜻이다.
//팩토리얼(balls)면 balls*balls-1
//근데 num*num-1이 아니라 num * 팩토리얼(num - 1)이니까 팩토리얼(num - 1)은 다시 해석하면
//num-1이 다시 num의 역할을 하면서 num-1*num-2, num-2*num-3...계속 반복하라는 뜻,
//결과적으로num*num-1*num-2*num-3....으로 num이 5라면 5*4*3*2*1이 된다.
//이런걸 재귀함수라고 한다. 재귀함수를 활용하면 코드가 깔끔해진다.
profile
신입 프론트엔드 웹 개발자입니다.

1개의 댓글

comment-user-thumbnail
2023년 1월 12일

어떻게 이렇게 꾸준히 하실 수 있나요??
열심히하는 것도 좋지만 적당한 휴식도 중요해요!

답글 달기