인기 있는 5권짜리 시리즈에서 여러 책을 더 많이 팔기 위해, 한 서점이 여러 권을 한 번에 구매할 때 할인을 제공하기로 했어요.
다섯 권 중 어떤 책이든 한 권에 $8이에요.
그런데 서로 다른 책 두 권을 사면, 그 두 권에 5% 할인이 적용돼요.
서로 다른 책 3권을 사면 10% 할인을 받아요.
서로 다른 책 4권을 사면 20% 할인을 받아요.
5권을 모두 사면 25% 할인을 받아요.
네 권을 사는데 그중 3권이 서로 다른 책이라면, 세트를 이루는 3권에는 10% 할인이 적용되지만 네 번째 책은 여전히 $8이라는 점에 주의해요.
이제 임무는 (같은 시리즈의 책만 담긴) 어떤 장바구니든 그 가격을 계산하면서, 가능한 한 할인을 크게 받도록 하는 코드를 작성하는 거예요.
예를 들어, 이 장바구니에 담긴 책은 얼마일까요?
이 8권을 묶는 한 가지 방법은 다음과 같아요:
이 경우 총합은 다음과 같아요:
그 결과:
합계는 $51.60이에요.
그런데 이 8권을 묶는 또 다른 방법이 있어요:
이 경우 총합은 다음과 같아요:
그 결과:
합계는 $51.20이에요.
그리고 $51.20이 가장 큰 할인이 적용된 가격이에요.
WebAssembly export total의 함수 시그니처는 다음과 같아요:
(func (export "total")
(param $basketOffset i32)
(param $basketLength i32)
(result i32)
)
두 매개변수 $basketOffset과 $basketLength는 32비트 정수 배열의 기준 오프셋과 길이를 나타내요. 길이 매개변수의 단위는 바이트가 아니라 배열에 있는 원소의 개수예요. 이 함수를 호출하기 전에 호출자는 이 배열을 오프셋 $basketOffset부터 시작하는 WebAssembly 선형 메모리에 기록해요. WebAssembly 선형 메모리는 항상 리틀 엔디언으로 표현돼요.
예를 들어 호출자는 바구니 [1,2]를 다음과 같은 8바이트 시퀀스로 인코딩해요.
| 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 |
| --- basket[0] --- | --- basket[1] --- |
,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
Exercism에 가입하고 WebAssembly 트랙을 연습 문제 87개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.