Algorithm JS | 프로그래머스 코딩테스트_커피 심부름

앙두·2023년 6월 9일
0

Algorithm

목록 보기
12/17

📑 문제

  • americano(ice/hot) : 4500
  • cafelatte(ice/hot) : 5000
  • 메뉴만 적으면 ice americano (4500) or ice cafelatte (5000)
  • 아무거나(anything)이면 아이스 아메리카노 (4500)
  • 인자는 string 배열
  • return 값은 number

🤓 나의 풀이

쉬운 문제였다! 그러나 +1점 밖에 획득하지 못했는데 ... 왜일까 ?
for 문은 아무래도 시간 over 가 되서 그런걸까 ?
좀 더 다른 메서드를 응용하여 풀어야 성능이 높아지나 ?!

function solution(o) {
  let priceToPay = 0;

  for (let el of o) {
    el.includes('americano') || el.includes('anything') ?
    priceToPay += 4500 : priceToPay += 5000
  }

  return priceToPay;
}

일단 나는 for of 문을 썼다.
처음에는 for 문으로 풀었는데, for of 가 좀 더 시간을 단축시켜줄줄 알고, 바꾸었다. (아니였나 ㅜ_ㅜ)


👍🏻 제일 간단한 풀이 (다른 사람들의 풀이 참고)

const solution = (o) =>
o.reduce((acc, cur) => acc + (cur.includes('cafelatte') ? 5000 : 4500), 0)

다른 사람의 풀이 중, 이게 가장 짧고 메서드도 하나만 사용해서 가져와보았다.
배열 메서드인 reduce를 사용했다.
첫번째 인자 acc은 값이 누적되어 할당되는 accumulator이고, cur은 배열 내 현재요소(currentValue)를 가리킨다.
맨 끝에 0initialValue 자리로, acc의 초기값을 설정해주는 곳이다.

cur(현재요소)에 'cafelatte'라는 string이 포함되어 있으면, 5000원, 아니면 나머지 다 4500원이다.
저 연산에 따라 acc에 숫자가 누적되며 할당된다 ( = 계속 더해진다 )

그럼 올바른 값이 나온다.
reduce를 자주 사용해 보아야겠다 👍🏻

💫 리팩토링

function solution(o) {
  let priceToPay = 0;

  for (let i = 0; i < o.length; i++) {
    o[i].includes('cafelatte') ?
    priceToPay += 5000 : priceToPay += 4500
  }

  return priceToPay;
}

원래 풀었었던 for문으로 다시 리팩토링 ..
그리고 사실 'cafelatte' 만 금액이 다르기 때문에, 'cafelatte' 로만 조건을 걸어주면 되었다.
코드 더 단축~!

오늘 끗!

profile
쓸모있는 기술자

0개의 댓글