가변 길이 수량 인코딩과 디코딩을 구현해요.
이 연습 문제의 목표는 VLQ 인코딩과 디코딩을 구현하는 거예요.
간단히 말해, 이 인코딩의 목표는 바이트를 절약하는 방식으로 정수 값을 인코딩하는 거예요. 각 바이트에서 처음 7비트만 의미가 있어요(오른쪽으로 정렬되고, 어쩐지 ASCII 바이트와 비슷하죠). 그래서 32비트 값이 있다면, 그 값을 7비트 바이트 여러 개로 풀어내야 해요. 물론 정수에 따라 바이트 개수는 달라져요. 여러 바이트 가운데 어느 것이 마지막인지 나타내려면, 7번 비트를 0으로 남겨 둬요. 앞에 오는 모든 바이트에서는 7번 비트를 1로 설정해요.
따라서 정수가 0-127 사이에 있다면, 한 바이트로 표현할 수 있어요.
VLQ는 임의 크기의 수를 다룰 수 있지만, 이 연습 문제에서는 32비트 부호 없는 정수에 들어가는 수만 다루기로 해요.
다음은 32비트 값으로 표현한 정수와, 그에 대응하는 가변 길이 수량의 예예요:
NUMBER VARIABLE QUANTITY
00000000 00
00000040 40
0000007F 7F
00000080 81 00
00002000 C0 00
00003FFF FF 7F
00004000 81 80 00
00100000 C0 80 00
001FFFFF FF FF 7F
00200000 81 80 80 00
08000000 C0 80 80 00
0FFFFFFF FF FF FF 7F
때로는 예외를 발생시켜야 하는 경우가 있어요. 이럴 때는 오류의 원인이 무엇인지 알려 주는 의미 있는 오류 메시지를 항상 함께 넣어야 해요. 그래야 코드를 더 읽기 쉽게 만들 수 있고 디버깅에도 큰 도움이 돼요. 오류의 원인이 어떤 특정 유형이라는 것을 알고 있는 상황이라면 내장 오류 유형 중 하나를 발생시켜도 되지만, 그래도 의미 있는 메시지는 함께 넣어야 해요.
이 연습 문제에서는 디코딩하거나 인코딩할 시퀀스가 불완전할 때 ValueError를 "던지기" 위해 raise 문을 사용해야 해요. exception을 raise하고 그와 함께 메시지를 넣어야만 테스트를 통과할 수 있어요.
메시지와 함께 ValueError를 발생시키려면, 메시지를 exception 타입의 인자로 작성해요:
# if the sequence is incomplete
raise ValueError("incomplete sequence")
Exercism에 가입하고 Python 트랙을 개념 17개연습 문제 146개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.