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

프로그래머스 0단계 - Day5 수학, 배열

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

옷가게 할인 받기

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

  • 10 ≤ price ≤ 1,000,000
    price는 10원 단위로(1의 자리가 0) 주어집니다.
  • 소수점 이하를 버린 정수를 return합니다.
function solution(price) {
  if(price >= 500000) return Math.floor(price * 0.8);
  if(price >= 300000) return Math.floor(price * 0.9);
  if(price >= 100000) return Math.floor(price * 0.95);
  return price;
}

// 다른 사람의 풀이
const discounts = [
  [500000, 20],
  [300000, 10],
  [100000,  5],
]

const solution = (price) => {
  for (const discount of discounts)
    if (price >= discount[0]) return Math.floor(price - price * discount[1] / 100);
  return price;
}

큰 금액을 아래로 배치할 경우, 동작하지 않아서 else if문을 사용해야 하지만, 큰 금액을 위에서부터 배치하면 if문 만으로 정리할 수 있다. return을 사용하지 않는다면, if - esle if로 처리해도 된다.

--> 삼항 연산자로 해결할 수 있으나, 가독성이 떨어질 것 같다.

--> switch문으로 작성할 수도 있다.

 

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

1) 금액과 할인율을 배열로 묶고, for of 반복문을 사용한다.

2) 가격이 discount[0], 즉 비용보다 크거나 같으면 discount[1] (할인율)을 적용하여 계산한다.


아이스 아메리카노

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

  • 0 < money ≤ 1,000,000
function solution(money) {
  const coffeeCnt = Math.floor(money / 5500);
  const change = money % 5500;
  return [coffeeCnt, change];
}

// 다른 사람의 풀이
function solution(money) {
  let count = 0;
  while (money >= 5500) {
    money -= 5500;
    count++;
  }
  return [count, money];
}

1) 주문할 수 있는 커피의 갯수는 가격 5500원의 배수가 되어야 한다. 그 몫을 구하면 된다.

2) 남은 돈은 나머지 연산자를 사용하여 구한다.

3) 배열의 요소로 넣는다.

 

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

1) 주어진 돈이 5500보다 크거나 같을 때, 반복문을 수행한다.

2) 5500원을 지불했다는 것은 구입했다는 의미이므로, count++; 를 해준다.

3) 조건식에 부합할 때까지 반복되므로, 자연스럽게 배열의 요소가 되게끔 [count, money] 작성한다.


나이 출력

머쓱이는 선생님이 몇 년도에 태어났는지 궁금해졌습니다. 2022년 기준 선생님의 나이 age가 주어질 때, 선생님의 출생 연도를 return 하는 solution 함수를 완성해주세요

  • 0 < age ≤ 120
  • 나이는 태어난 연도에 1살이며 매년 1월 1일마다 1살씩 증가합니다.
function solution(age) {
  return 2022 - age + 1;
}

// 다른 사람의 풀이
function solution(age) {
  return new Date().getFullYear() - age + 1;
}

사람이 계산하는 방식대로 작성하였다. ㅋㅋㅋㅋ

 

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

Date객체의 getFullYear() 메소드 사용


배열 뒤집기

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

  • 1 ≤ num_list의 길이 ≤ 1,000
  • 0 ≤ num_list의 원소 ≤ 1,000
function solution(num_list) {
  let answer = [];
  let i = num_list.length - 1;
  while(i >= 0) {
    answer.push(num_list[i]);
    i--;
  }
  return answer;
}

// 다른 사람의 풀이
function solution(num_list) {
  return num_list.sort((a, b) => -1);
}

function solution(num_list) {
  let answer = [];
  num_list.forEach(i => answer.unshift(i))
  return answer
}

배열의 reverse()를 쓰면 한 번에 해결되지만, 반복문을 사용하여 풀었다.

1) 배열의 요소의 위치는 배열의 길이 -1이므로 반복문의 변수 i 에 할당한다.

2) num_list[i] : 배열 num_list의 i 번째 위치의 값을 새로운 배열 answer에 넣는다.

3) 배열 num_list의 위치가 0이 될 때까지 반복한다. 그러면 완성!

 

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

sort() 메소드

-> sort() 메소드는 원본 배열을 수정한다. (a, b) => -1을 함으로써 역순으로 정렬

 

forEach() 메소드

-> forEach() 메소드는 원본 배열을 순회한다.

-> 순회하면서 i번째의 요소를 새로운 배열의 앞에서부터 넣어준다.


참고 영상

https://youtu.be/uv94QWdGpUE?si=ICzZZT0j1PI17XGY

댓글