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

소히·2022년 10월 27일
0

알고리즘Daily

목록 보기
8/22
post-thumbnail

연속된 수의 합


문제

연속된 세 개의 정수를 더해 12가 되는 경우는 3, 4, 5입니다. 두 정수 num과 total이 주어집니다. 연속된 수 num개를 더한 값이 total이 될 때, 정수 배열을 오름차순으로 담아 return하도록 solution함수를 완성해보세요.


제한사항

  • 1 ≤ num ≤ 100
  • 0 ≤ total ≤ 1000
  • num개의 연속된 수를 더하여 total이 될 수 없는 테스트 케이스는 없습니다.

입출력 예

  • num = 3, total = 12인 경우 [3, 4, 5]를 return합니다.
    입출력 예 #2

  • num = 5, total = 15인 경우 [1, 2, 3, 4, 5]를 return합니다.

풀이

첫 풀이는 start, mid, end 를 구한 후,
num이 홀수 일 때와 짝수 일 때를 분기하여 다르게 작성해주었지만
코드가 길어지고 중복 + 가독성 또한 떨어져서 수정하였다..

start,mid,end값을 구하고 new Array메서드를 이용해 새로운 배열을 생성 한 후 값을 담아주었다.

function solution(num, total) {
  let mid = total / num;
  let start = Math.ceil(mid - Math.floor(num / 2));
  let end = Math.floor(mid + Math.floor(num / 2));

  return new Array(end - start + 1).fill().map((arr, i) => {
    return i + start;
  });
}

아이스 아메리카노


문제

머쓱이는 추운 날에도 아이스 아메리카노만 마십니다. 아이스 아메리카노는 한잔에 5,500원입니다. 머쓱이가 가지고 있는 돈 money가 매개변수로 주어질 때, 머쓱이가 최대로 마실 수 있는 아메리카노의 잔 수와 남는 돈을 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.


풀이

첫번재 배열요소는 사먹을 수 있는 아메리카노 갯수이므로 가지고있는 돈 / 5500원을 해주어서 소수점을 버려주었다.
두번째 배열요소는 거스름돈이므로 가지고있는 돈에서 5500원을 나눈 나머지를 리턴해주었다.

function solution(money) {
  return [parseInt(money / 5500), money % 5500];
}


배열 뒤집기


문제

정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ num_list의 길이 ≤ 1,000
  • 0 ≤ num_list의 원소 ≤ 1,000

입출력 예

  • num_list가 [1, 2, 3, 4, 5]이므로 순서를 거꾸로 뒤집은 배열 [5, 4, 3, 2, 1]을 return합니다.

풀이

주어진 배열을 역순으로 뒤집는 문제였는데,
reverse() 메서드를 사용할 수 있었지만 사용하지 않고 풀어보았다.

tempArr로 임시 배열을 만든 후,
주어진 배열을 역순으로 push 해준 후 tempArr와 주어진 배열의 길이가 같아지면(종료 조건) tempArr를 리턴하도록 하였다.

function solution(num_list) {
  let tempArr = [];

  for (let i in num_list) {
    tempArr.push(num_list[num_list.length - i - 1]);
    if (tempArr.length === num_list.length) return tempArr;
  }
}

옷가게 할인 받기


문제

머쓱이네 옷가게는 10만 원 이상 사면 5%, 30만 원 이상 사면 10%, 50만 원 이상 사면 20%를 할인해줍니다.
구매한 옷의 가격 price가 주어질 때, 지불해야 할 금액을 return 하도록 solution 함수를 완성해보세요.


제한사항

  • 1 ≤ num_list의 길이 ≤ 1,000
  • 0 ≤ num_list의 원소 ≤ 1,000

입출력 예

  • 10 ≤ price ≤ 1,000,000
    price는 10원 단위로(1의 자리가 0) 주어집니다.
  • 소수점 이하를 버린 정수를 return합니다.

풀이

switch 문으로 조건을 분기하여 옷 가격의 할인율을 계산하였다.
🪓 생각보다 switch 문이 손으로 잘 써지지 않아서 연습하고 있다..
할인 적용된 금액에서 소수점을 버려야 했기 때문에 처음에는 parseInt를 사용하였지만,
서칭 결과 ~~ 연산자의 존재를 알게 되었고 이는 Math.floor()와 동일하게 쓰인다고 한다.
그래서 ~~ 연산자로 테스트 해 본 결과 통과하였다.
❗️ 하지만 가독성이 떨어질 수 있으니 주의 하자!!

function solution(price) {
  switch (true) {
    case price >= 100000 && price < 300000:
      return ~~(price * 0.95);
    case price >= 300000 && price < 500000:
      return ~~(price * 0.9);
    case price >= 500000:
      return ~~(price * 0.8);
    default:
      return price;
  }
}

배열 뒤집기


문제

정수가 들어 있는 배열 num_list가 매개변수로 주어집니다. num_list의 원소의 순서를 거꾸로 뒤집은 배열을 return하도록 solution 함수를 완성해주세요.


제한사항

  • 1 ≤ num_list의 길이 ≤ 1,000
  • 0 ≤ num_list의 원소 ≤ 1,000

입출력 예

  • num_list가 [1, 2, 3, 4, 5]이므로 순서를 거꾸로 뒤집은 배열 [5, 4, 3, 2, 1]을 return합니다.

풀이

주어진 배열을 역순으로 뒤집는 문제였는데,
reverse() 메서드를 사용할 수 있었지만 사용하지 않고 풀어보았다.

tempArr로 임시 배열을 만든 후,
주어진 배열을 역순으로 push 해준 후 tempArr와 주어진 배열의 길이가 같아지면(종료 조건) tempArr를 리턴하도록 하였다.

function solution(num_list) {
  let tempArr = [];

  for (let i in num_list) {
    tempArr.push(num_list[num_list.length - i - 1]);
    if (tempArr.length === num_list.length) return tempArr;
  }
}

추가로 배열이 아닌 문자열 뒤집는 문제가 있었는데,
위 풀이를 바탕으로 하였으나 다른점이 있다면 문자열이므로 join 메서드를 사용하여 배열을 벗기고 문자열로 리턴하였다.

function solution(num_list) {
  let tempArr = [];

  for (let i in num_list) {
    tempArr.push(num_list[num_list.length - i - 1]);
    if (tempArr.length === num_list.length) return tempArr.join("");
  }
}

0개의 댓글