혼합 주스

혼합 주스

학습 연습 문제

소개

while문

while문을 사용하면 특정 조건이 만족되는 동안 코드를 반복해서 실행할 수 있어요. while 키워드 뒤에 소괄호로 감싼 조건을 쓰고, 중괄호로 감싼 루프의 _본문_을 담은 코드 블록을 붙여서 작성해요.

while (condition) {
  // code that is executed repeatedly as long as the condition is true
}

JavaScript에는 do-while문도 있어요. do-while문에서는 루프 본문을 실행한 뒤에 조건을 확인해요. 조건이 본문에서 수행한 계산에 따라 달라질 때 유용해요.

do {
  // The code here will always be executed once and then
  // repeatedly while the condition is true.
} while (condition);

루프 본문 안에서는 break 키워드를 사용해서 루프 실행을 완전히 멈출 수 있어요. 이와 달리 continue 키워드는 현재 반복의 실행만 멈추고 다음 반복을 이어가요. continue를 사용하면 루프 본문의 많은 부분을 if문으로 감싸는 일을 자주 피할 수 있어요.

let i = 0;

while (i < 100) {
  i = i + 2;

  if (i % 3 === 0) {
    continue;
  }

  // The code here will only be executed when i was not divisible
  // by 3 in the check above.
}

switch문

if문 외에도 JavaScript에는 조건에 따라 로직을 실행하는 switch문이 있어요. 하나의 변수를 여러 값과 비교해야 할 때 사용해요. 비교는 일치 연산자(===)로 엄격한 동등성을 확인하는 방식으로 이루어져요. 자세한 내용은 비교 개념을 참고해요. 어떤 변수 x에 대해, JavaScript의 switch문은 다음과 같은 문법을 가져요.

switch (x) {
  case option1:
    // code that is executed when "x === option1" is true
    break;
  case option2:
    // code that is executed when "x === option2" is true
    break;
  default:
    // code that is executed when x does not equal any of the options
}

default 케이스는 선택 사항이며, 다른 옵션 중 어느 것도 변수와 일치하지 않을 때 어떤 코드를 실행하고 싶은 경우에 사용해요.

위의 break문이 필요한 이유는 JavaScript에서는 기본적으로 모든 케이스가 이어서 실행되는 폴스루 방식이기 때문이에요. 즉, break문이 없으면 처음 일치한 옵션 아래에 있는 케이스의 코드가 모두 실행되는데, x가 그 옵션들과 일치하지 않았더라도 마찬가지예요. 이렇게 기본적으로 이어서 실행되는 동작은 JavaScript에서 switch를 사용할 때 흔히 빠지는 함정이에요. 함수 안에서는 이 문제를 피하기 위해 break 대신 return을 사용할 수도 있어요.

지침

친구 Li Mei는 맛있는 과일 주스를 파는 주스 바를 운영해요. 여러분은 그 가게의 단골손님인데, 코딩 실력을 활용하면 친구의 일을 더 편하게 만들어 줄 수 있겠다는 생각이 들었어요. 그래서 코딩 실력으로 Li Mei의 일을 도와주기로 했어요.

1. 주스 하나를 만드는 데 걸리는 시간 알아내기

Li Mei는 손님이 주문한 메뉴의 주스를 얼마나 기다려야 하는지 미리 알려 주는 걸 좋아해요. 주스마다 만드는 데 걸리는 시간이 달라서 정확한 숫자를 외우기가 어려워요. 'Pure Strawberry Joy'는 0.5분, 'Energizer'와 'Green Garden'은 각각 1.5분, 'Tropical Island'는 3분, 'All or Nothing'은 5분이 걸려요. 그 밖의 다른 음료(예: 특별 메뉴)는 준비 시간이 2.5분이라고 가정해요.

친구를 도와주려면, 메뉴에 있는 주스 하나를 인자로 받아 그 음료를 만드는 데 걸리는 시간(분)을 반환하는 함수 timeToMixJuice를 작성해요.

timeToMixJuice('Tropical Island');
// => 3

timeToMixJuice('Berries & Lime');
// => 2.5

2. 라임 웨지 재고 채우기

Li Mei가 만드는 음료 중에는 재료로든 장식으로든 라임 웨지가 들어가는 게 많아요. 그래서 아침에 근무를 시작할 때는 그날 하루 쓸 라임 웨지 통이 가득 차 있는지 확인해야 해요.

Li Mei가 잘라야 하는 라임 웨지의 개수와, 손에 있는 통라임의 재고를 나타내는 배열을 인자로 받는 함수 limesToCut을 구현해요. 'small' 라임에서는 웨지 6개, 'medium' 라임에서는 8개, 'large' 라임에서는 10개를 얻을 수 있어요. 라임은 목록에 나온 순서대로, 첫 번째 것부터 잘라요. 필요한 만큼의 웨지를 얻거나 라임이 다 떨어질 때까지 계속 잘라요.

Li Mei는 라임을 몇 개나 잘라야 하는지 미리 알고 싶어 해요. limesToCut 함수는 잘라야 하는 라임의 개수를 반환해야 해요.

limesToCut(25, ['small', 'small', 'large', 'medium', 'small']);
// => 4

3. 근무 마무리하기

Li Mei는 항상 오후 3시까지 일해요. 그다음에는 직원인 Dmitry가 이어받아요. Li Mei의 근무가 끝날 때쯤에는 주문은 들어왔지만 아직 만들지 않은 음료가 자주 있어요. 그러면 Dmitry가 남은 주스를 만들어요.

인수인계를 쉽게 하려면, Li Mei의 근무에 남은 시간(분)과 주문은 들어왔지만 아직 준비하지 않은 주스들의 배열을 인자로 받는 함수 remainingOrders를 구현해요. 이 함수는 Li Mei가 퇴근 전에 손을 댈 수 없는 주문을 반환해야 해요.

근무에 남은 시간은 항상 0보다 커요. 준비해야 할 주스 배열은 절대 비어 있지 않아요. 또한 주문은 배열에 나온 순서대로 준비해요. Li Mei가 어떤 주스를 만들기 시작하면, 조금 더 일해야 하더라도 그 주스는 항상 끝까지 만들어요. Dmitry가 처리해야 할 남은 주문이 없다면 빈 배열을 반환해야 해요.

remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
JavaScript Exercism

혼합 주스 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 JavaScript 트랙을 개념 37개연습 문제 159개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.