트랙
/
Julia
Julia
/
연습 문제
/
혼합 주스
혼합 주스

혼합 주스

학습 연습 문제

소개

루프에는 기본적으로 두 가지 종류가 있어요:

  1. 조건이 만족될 때까지 반복해요.
  2. 컬렉션의 원소를 순회해요.

둘 다 Julia에서 가능하지만, 두 번째가 더 흔할 수 있어요.

while문

루프를 몇 번 도는지 미리 알 수 없는 열린 문제에는 Julia의 while문을 사용해요.

기본 형태는 아주 간단해요:

while condition
    do_something()
end

이 경우 프로그램은 condition이 더 이상 true가 아닐 때까지 루프를 계속 돌아요.

루프에서 일찍 빠져나가는 두 가지 방법이 있어요:

  • break는 루프를 종료하고, 실행은 루프 end 다음 줄부터 이어져요.
  • return x는 현재 함수의 실행을 멈추고, 반환값 x를 호출한 곳에 돌려줘요.

이런 방법들을 활용하면 while true ... end로 "무한" 루프를 만들어 두고, 루프 본문 안에서 멈춤 조건을 찾아 break나 return을 실행하는 게 편리할 때가 있어요.

컬렉션 순회

가장 간단한 예는 범위를 순회하는 거예요.

10번 무언가를 하고 싶다면:

for n in 1:10
    do_something(n)
end

현재 반복이 어떤 조건을 만족하지 못하면, continue로 즉시 다음 반복으로 건너뛸 수 있어요:

for n in 1:10
    if is_useless(n)
        continue
    end
    
    # we decided this iteration could be useful
    do_something_slow(n)
end

더 짧은 형태로는 if 블록을 is_useless(n) && continue로 대체할 수 있어요.

다른 많은 컬렉션도 순회할 수 있어요: 배열의 원소, 문자열의 문자, 딕셔너리의 키...

지금까지의 예제는 1:10 범위를 순회했는데, 여기서는 값이 루프 인덱스이기도 해요.

더 일반적으로는 값뿐 아니라 인덱스가 필요할 수도 있어요. 이럴 때는 eachindex() 함수를 사용해요. 예를 들어 for i in eachindex(my_array) ... end처럼요.

지침

친구 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분이라고 가정해요.

친구를 돕기 위해, 메뉴에 있는 주스 하나를 인자로 받아 그 음료를 만드는 데 걸리는 분 수를 반환하는 함수 time_to_mix_juice를 작성해요.

julia> time_to_mix_juice("Tropical Island")
3

julia> time_to_mix_juice("Berries & Lime")
2.5

2. 라임 웨지 재고 채우기

Li Mei가 만드는 음료 중 상당수는 재료로든 장식으로든 라임 웨지를 포함해요. 그래서 아침에 근무를 시작할 때, 그녀는 하루를 대비해 라임 웨지 통을 가득 채워 두어야 해요.

함수 limes_to_cut을 구현해요. 이 함수는 Li Mei가 잘라야 하는 라임 웨지의 개수와, 그녀가 가진 통라임의 공급량을 나타내는 배열을 인자로 받아요. "small" 라임에서는 웨지 6개, "medium" 라임에서는 웨지 8개, "large" 라임에서는 10개를 얻을 수 있어요. 그녀는 항상 목록에 나온 순서대로, 첫 번째 항목부터 라임을 잘라요. 필요한 웨지 개수에 도달하거나 라임이 다 떨어질 때까지 계속 잘라요.

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

julia> limes_to_cut(25, ["small", "small", "large", "medium", "small"])
4

3. 대기 중인 각 주문을 만드는 데 걸리는 시간 나열하기

Li Mei는 손님들이 기다리고 있는 주문을 만드는 데 얼마나 걸릴지 계속 파악해 두는 걸 좋아해요.

order_times 함수를 구현해요. 이 함수는 주문 대기열을 인자로 받아, 만드는 데 걸리는 시간들의 벡터를 반환해요.

julia> order_times(["Energizer", "Tropical Island"])
[1.5, 3.0]

4. 근무 마무리하기

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

인수인계를 더 쉽게 하기 위해, 함수 remaining_orders를 구현해요. 이 함수는 Li Mei의 근무 시간에 남은 분과, 주문은 들어왔지만 아직 준비하지 못한 주스들의 배열을 인자로 받아요. 이 함수는 Li Mei가 근무가 끝나기 전에 만들기 시작할 수 없는 주문들을 반환해야 해요.

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

julia> remaining_orders(5, ["Energizer", "All or Nothing", "Green Garden"])
["Green Garden"]
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Julia Exercism

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

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