본문 바로가기
코딩테스트/프로그래머스 0단계 - 입문

프로그래머스 0단계 - Day9 수학, 문자열, 해시, 완전탐색, 조건문

by 학습하는 청년 2024. 3. 18.

개미 군단

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

  • hp는 자연수입니다.
  • 0 ≤ hp ≤ 1000
function solution(hp) {
    let answer = 0;
    if(hp >= 5) {
        answer += Math.floor(hp / 5);
        hp -= Math.floor(hp / 5) * 5;
    }
    if(hp >= 3) {
        answer += Math.floor(hp / 3);
        hp -= Math.floor(hp / 3) * 3;
    }
    if (hp >= 1) {
        answer += Math.floor(hp / 1);
        hp -= Math.floor(hp / 1) *1;
    }
    return answer;
}

// 다른 사람의 풀이
function solution(hp) {
  let cnt = 0;
  let arr = [5, 3, 1];
  let i = 0;
  while(i <arr.length) {
    let item = arr[i];
    if(hp >= item) {
      cnt += Math.floor(hp / item);
      hp -= Math.floor(hp / item) * item;
    }
    i++;
  }
  return cnt;
}

function solution(hp) {
    let cnt = 0;
    [5,3,1].forEach(v => {
        cnt += Math.floor(hp/v);
        hp = hp % v;
    })

    return cnt;
}

 

<다른 사람의 풀이에 대한 이해>

공격력은 정해진 값이므로, 배열에 넣어서 풀어보고 싶었으나 떠오르지 않았다.

forEach()


모스부호 (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'
}

  • 1 ≤ letter의 길이 ≤ 1,000
  • return값은 소문자입니다.
  • letter의 모스부호는 공백으로 나누어져 있습니다.
  • letter에 공백은 연속으로 두 개 이상 존재하지 않습니다.
  • 해독할 수 없는 편지는 주어지지 않습니다.
  • 편지의 시작과 끝에는 공백이 없습니다.
const 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 currentMorse = '';
    let answer = '';
    for(let i = 0; i < letter.length; i++) {
        const item = letter[i];
        if(item === ' ') {
            answer += morse[currentMorse];
            currentMorse = '';
        } else {
            currentMorse += item;
        }
    }
    answer += morse[currentMorse];
    return answer;
}

// 다른 사람의 풀이
function solution(letter) {
  let answer = '';
  const splittedLetter = letter.split(' ');
  let i =;
  while(i < splittedLetter.length) {
    answer += morse[splittedLetter[i];
  }
  return answer;
}

return letter.split(' ').map(v=>morse[v]).join('');

function solution(letter) {
    return letter.split(' ').reduce((prev, curr) => prev + morse[curr], '')
}

 

<다른 사람의 풀이에 대한 이해>

split(' ')

map()

join()

reduce() : map() + join() ??


가위 바위 보

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

  • 0 < rsp의 길이 ≤ 100
  • rsp와 길이가 같은 문자열을 return 합니다.
  • rsp는 숫자 0, 2, 5로 이루어져 있습니다.
function solution(rsp) {
    let answer = '';
    let i = 0;
    while(i < rsp.length) {
        const item = rsp[i];
        if(item === "2") {
            answer += "0";
        }
        if(item === "0") {
            answer += "5";
        }
        if(item === "5") {
            answer += "2";
        }
        i++;
    }
    return answer;
}

// 다른 사람의 풀이
const win = {
  "2": "0",
  "0": "5",
  "5": "2",
}

function solution(rsp) {
  let answer = '';
  let i = 0;
  while(i < rsp.length) {
    const item = rsp[i];
    answer += win[item];
    i++;
  }
  return answer;
}

function solution(rsp) {
    let arr = {
        2: 0,
        0: 5,
        5: 2
    };
    var answer = [...rsp].map(v => arr[v]).join("");
    return answer;
}

 

<다른 사람의 풀이에 대한 이해>

각각 대응하는 요소들이 있으면 키와 값의 쌍으로 만들어, 객체를 사용하면 된다.

map()

join()


구슬을 나누는 경우의 수

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

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share ≤ balls
// 서로 다른 n개 중 m개를 뽑는 경우의 수
// => nCm = n! / (n-m)! * m!
// n! = n * (n-1) * ... * 1
function solution(balls, share) {
    let answer = 0;
    
    const n = balls;
    const r = share;
    
    let one = 1;
    let i = n;
    while(i >= n-r+1) {
        one *= i;
        i--;
    }
    let three = 1;
    let j = r;
    while(j >= 1) {
        three *= j;
        j--;
    }
    answer = Math.floor(one / three);
    
    return answer;
}

// 다른 사람의 풀이
const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)

function solution(balls, share) {
  return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}

function solution(balls, share) {
  return (
    Array.from({ length: share }, (_, i) => balls - i).reduce((a, b) => a * b) /
    Array.from({ length: share }, (_, i) => share - i).reduce((a, b) => a * b)
  );
}

단순히 팩토리얼만으로 계산하게 되면, 오버플로우 현상이 나타나서 해결할 수 없게 된다.

따라서, nCr => nPr+1 / r! 로 계산해야 한다.

 

<다른 사람의 풀이에 대한 이해>

Math.round()를 사용하면 부동소수점 문제를 해결할 수 있다.

 

Array.from()


참고 영상

https://youtu.be/qmcGPpZ5kJ4?si=UH7zxPZ4loElkMCY

 

부동소수점 문제에 대한 글

https://joooing.tistory.com/entry/Javascript-%EC%86%8C%EC%88%98%EC%A0%90floating-point-%EA%B3%84%EC%82%B0-%EC%98%A4%EB%A5%98

댓글