daily 알고리즘 : 프로그래머스 0 level 7일차

소히·2022년 11월 3일
0

알고리즘Daily

목록 보기
11/22
post-thumbnail

치킨 쿠폰


문제

프로그래머스 치킨은 치킨을 시켜먹으면 한 마리당 쿠폰을 한 장 발급합니다. 쿠폰을 열 장 모으면 치킨을 한 마리 서비스로 받을 수 있고, 서비스 치킨에도 쿠폰이 발급됩니다. 시켜먹은 치킨의 수 chicken이 매개변수로 주어질 때 받을 수 있는 최대 서비스 치킨의 수를 return하도록 solution 함수를 완성해주세요.


제한사항

  • chicken은 정수입니다.
  • 0 ≤ chicken ≤ 1,000,000

입출력 예

  • 100마리를 주문하면 쿠폰이 100장 발급되므로 서비스 치킨 10마리를 주문할 수 있습니다.
  • 10마리를 주문하면 쿠폰이 10장 발급되므로 서비스 치킨 1마리를 주문할 수 있습니다.
  • 따라서 10 + 1 = 11 을 return합니다.

풀이

처음 짠 로직이 한 케이스만 통과가 되지 않아서
한참 고민하다가 다른 사람 풀이를 참고해서 다시 구현해보았다.

10마리 주문마다 치킨 수를 +1 해주었다.

function solution(chicken) {
  let answer = 0;
  while (chicken >= 10) {
    let orderChicken = ~~(chicken / 10);
    let couponChicken = ~~(chicken % 10);
    chicken = orderChicken + couponChicken;
    answer += orderChicken;
  }
  return answer;
}

개미 군단


문제

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


제한사항

  • hp는 자연수입니다.
  • 0 ≤ hp ≤ 1000

입출력 예

  • hp가 24이므로, 장군개미 네마리 병정개미 한마리 일개미 한마리로 사냥할 수 있습니다. 따라서 6을 return합니다.

풀이

ant 배열에 개미 공격력을 나열한 후, hp를 배열 인덱스 별로 나누어 answer에 push 하였다.
answer 배열값을 모두 더한 값을 리턴해 주었다.

예를 들어 hp가 102 이었다면, answer 은 [20, 0, 2] 가 된다.

function solution(hp) {
  let ant = [5, 3, 1];
  let answer = [];

  for (let i of ant) {
    answer.push(~~(hp / i));
    hp %= i;
  }
  return answer.reduce((a, b) => a + b);
}


캐릭터의 좌표


문제

머쓱이는 RPG게임을 하고 있습니다. 게임에는 up, down, left, right 방향키가 있으며 각 키를 누르면 위, 아래, 왼쪽, 오른쪽으로 한 칸씩 이동합니다. 예를 들어 [0,0]에서 up을 누른다면 캐릭터의 좌표는 [0, 1], down을 누른다면 [0, -1], left를 누른다면 [-1, 0], right를 누른다면 [1, 0]입니다. 머쓱이가 입력한 방향키의 배열 keyinput와 맵의 크기 board이 매개변수로 주어집니다. 캐릭터는 항상 [0,0]에서 시작할 때 키 입력이 모두 끝난 뒤에 캐릭터의 좌표 [x, y]를 return하도록 solution 함수를 완성해주세요.

  • [0, 0]은 board의 정 중앙에 위치합니다. 예를 들어 board의 가로 크기가 9라면 캐릭터는 왼쪽으로 최대 [-4, 0]까지 오른쪽으로 최대 [4, 0]까지 이동할 수 있습니다.

제한사항

  • board은 [가로 크기, 세로 크기] 형태로 주어집니다.
  • board의 가로 크기와 세로 크기는 홀수입니다.
  • board의 크기를 벗어난 방향키 입력은 무시합니다.
  • 0 ≤ keyinput의 길이 ≤ 50
  • 1 ≤ board[0] ≤ 99
  • 1 ≤ board[1] ≤ 99
  • keyinput은 항상 up, down, left, right만 주어집니다.

입출력 예

  • [0, 0]에서 아래로 다섯 칸 이동한 좌표는 [0, -5]이지만 맵의 세로 크기가 9이므로 아래로는 네 칸을 넘어서 이동할 수 없습니다. 따라서 [0, -4]를 return합니다.

풀이

board 크기의 범위를 벗어나지 않는 조건에서 좌표를 이동시켜주었다.

function solution(keyinput, board) {
  const answer = [0, 0];
  let boardWidth = board[0] / 2;
  let boardHeight = board[1] / 2;

  for (let i of keyinput) {
    switch (i) {
      case "left":
        if (-answer[0] < boardWidth - 1) answer[0]--;
        break;
      case "right":
        if (answer[0] < boardWidth - 1) answer[0]++;
        break;
      case "up":
        if (answer[1] < boardHeight - 1) answer[1]++;
        break;
      case "down":
        if (-answer[1] < boardHeight - 1) answer[1]--;
        break;
    }
  }

  return answer;
}

가위 바위 보


문제

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


제한사항

  • 0 < rsp의 길이 ≤ 100
  • rsp와 길이가 같은 문자열을 return 합니다.
  • rsp는 숫자 0, 2, 5로 이루어져 있습니다.

입출력 예

  • "205"는 순서대로 가위, 바위, 보이고 이를 모두 이기려면 바위, 보, 가위를 순서대로 내야하므로 “052”를 return합니다.

풀이

/
이길 수 있는 조건들을 객체 형태로 저장하였다.
그 후 rsp 인덱스값을 win객체의 키에 대입하여 값을 얻고, 정답을 리턴해주었다.
/

function solution(rsp) {
  let answer = "";
  let win = { 2: "0", 0: "5", 5: "2" };
  for (let i of rsp) {
    answer += win[i];
  }
  return answer;
}

구슬을 나누는 경우의 수


문제

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


제한사항

  • 2 ≤ numbers의 길이 ≤ 30
  • 0 ≤ numbers의 원소 ≤ 1,000
  • 0 ≤num1 < num2 < numbers의 길이

입출력 예

  • 1 ≤ balls ≤ 30
  • 1 ≤ share ≤ 30
  • 구슬을 고르는 순서는 고려하지 않습니다.
  • share ≤ balls
  • 서로 다른 구슬 5개 중 3개를 고르는 경우의 수는 10입니다.

풀이

factorial 연산을 재귀함수로 구현해주었다.

function fac(num) {
  if (num === 0) return 1;
  return num * fac(num - 1);
}

function solution(balls, share) {
  return Math.round(fac(balls) / (fac(balls - share) * fac(share)));
}

0개의 댓글