라자냐

라자냐

학습 연습 문제

소개

Julia 트랙 전체에서는 풀이를 작은 라이브러리처럼 다뤄야 해요. 즉, 함수나 타입 등을 정의하고, 그것들이 테스트 스위트에서 실행되도록 만들어야 해요. 그래서 가장 먼저 이름 있는 함수를 첫 번째 개념으로 소개할게요.

Julia는 동적이면서 타입이 엄격한 프로그래밍 언어예요. 프로그래밍 스타일은 주로 함수형이지만, Haskell 같은 언어보다 유연성이 더 커요.

변수와 할당

변수를 미리 선언할 필요가 없어요. 적당한 이름에 값을 할당하기만 하면 돼요.

julia> myvar = 42  # an integer
42

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

상수

어떤 값이 프로그램 전체에서 쓰일 수 있어야 하지만 바뀌지는 않아야 한다면, 그 값을 상수로 표시하는 게 가장 좋아요.

할당 앞에 const 키워드를 붙이면, 컴파일러가 변수를 쓸 때보다 더 효율적인 코드를 생성할 수 있어요.

상수는 코딩할 때 오류로부터 보호해 주기도 해요. 실수로 const 값을 바꾸려고 하면 경고가 나와요.

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

const는 함수 바깥에서만 선언할 수 있다는 점에 주의해요. 보통 *.jl 파일의 맨 위, 함수 정의보다 앞에 오게 돼요.

산술 연산자

다른 많은 언어와 같아요.

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division with floating-point result)
8 % 3  # 2 (remainder)

함수

Julia에서 이름 있는 함수를 정의하는 일반적인 방법은 두 가지예요.

  1. function 키워드 사용하기

    function muladd(x, y, z)
        x * y + z
    end
    

    4칸 들여쓰기가 가독성을 위해 관례적으로 쓰이지만, 컴파일러는 이를 무시해요. end 키워드는 꼭 필요해요.

    return x * y + z라고 쓸 수도 있었어요. 하지만 Julia 함수는 항상 마지막으로 평가된 표현식을 반환하므로, return 키워드는 선택 사항이에요. 많은 프로그래머는 의도를 더 분명히 드러내려고 이 키워드를 넣는 걸 선호해요.

  2. "할당 형식" 사용하기

    muladd(x, y, z) = x * y + z
    

    간결한 단일 표현식 함수를 만들 때 가장 흔히 사용해요.

    할당 형식에서는 return 키워드를 절대 사용하지 않아요.

두 형식은 동등하고 완전히 같은 방식으로 사용되므로, 더 읽기 쉬운 쪽을 고르면 돼요.

함수를 호출할 때는 함수 이름을 쓰고, 함수의 각 매개변수에 대응하는 인자를 전달해요.

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

이름 규칙

많은 언어와 마찬가지로, Julia에서는 이름(변수, 함수, 그리고 여러 다른 것들의 이름)이 문자로 시작하고, 그 뒤에 문자, 숫자, 밑줄이 어떤 조합으로든 올 수 있어요.

관례상 변수, 상수, 함수 이름은 소문자로 쓰고, 밑줄은 합리적인 최소한으로만 사용해요.

지침

이 연습 문제에서는 좋아하는 요리책에 나오는 근사한 라자냐를 만들 수 있도록 코드를 작성해 볼 거예요.

라자냐를 만드는 데 걸리는 시간과 관련된 네 가지 과제가 있어요.

1. 예상 조리 시간을 상수에 저장하기

expected_bake_time 상수를 정의해요. 이 상수는 라자냐를 오븐에서 몇 분 동안 구워야 하는지를 나타내요.

요리책에 따르면, 라자냐는 총 60분 동안 오븐에 있어야 해요.

julia> expected_bake_time
60

2. 준비 시간을 분 단위로 계산하기

preparation_time 함수를 정의해요. 이 함수는 라자냐에 넣은 층의 개수를 인자로 받고, 각 층을 준비하는 데 2분이 걸린다고 가정했을 때 라자냐를 준비하는 데 몇 분이 걸렸는지를 반환해요.

julia> preparation_time(4)
8

3. 남은 오븐 조리 시간을 분 단위로 계산하기

remaining_time 함수를 정의해요. 이 함수는 라자냐가 지금까지 오븐에 있던 실제 시간(분)을 매개변수로 받고, 라자냐가 오븐에 앞으로 몇 분 더 있어야 하는지를 반환해요.

julia> remaining_time(50)
10

4. 총 작업 시간을 분 단위로 계산하기

total_working_time 함수를 정의해요. 이 함수는 두 개의 인자를 받는데, 첫 번째 인자는 라자냐에 넣은 층의 개수이고, 두 번째 인자는 라자냐가 오븐에 있던 시간(분)이에요.

이 함수는 라자냐 요리에 총 몇 분을 들였는지를 반환해야 해요. 이는 준비 시간(분)과 현재까지 라자냐가 오븐에 있던 시간(분)을 더한 값이에요.

julia> total_working_time(3, 20)
26
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Julia Exercism

라자냐 문제를 시작해 볼 준비가 됐나요?

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