보통 switch 문법이라고 하면 정수값을 하나 받아서 그 값에 대응되는 case로 이동해 코드 실행 흐름을 바꾸는 문법이라고 알고 있어. 만약 대응되는 case가 없거나 잘못된 값이 들어왔을때는 default로 이동하고 기본값으로 정의된 코드를 실행. 실제 기계어로 변환될때는 상황마다 조금 달라지는데 적당하다면 점프 테이블로 구현되고 case가 너무 적거나 값 사이에 빈 공간이 많으면 if로 때워버리기도 한다고 하네.


일부 언어들은 switch 문법을 제공하지 않아서 다른 방법으로 구현해야하는 경우가 있는데 꼭 필요하지 않다면 대체 가능한 문법이 있을수도 있고 반드시 switch가 필요한지 검토하고 논리를 조금만 바꾸면 대체가 가능하지 않을지, 성능을 조금만 포기하면 그래도 가능성이 보이는 경우가 많았어. switch 문법이 if 문법보다 항상 우월하진 않아서 일부 특수한 상황을 제외하면 if 문으로 퉁치는 것도 나쁘지 않거나 오히려 더 우수한 경우가 많았어.


그런데 난제가 생겼다. 계산기에 Python으로 프로그래밍을 해야할 일이 있었어. 하지만 알다시피 Python은 고유의 철학으로 인해 '지나치게' 아주 깔끔한 문법을 고수해서 switch 같은건 존재하지도 않지. 함수 하나 작성하면 끝이였지만 계산식이 불규칙했어.


문제 :

3개의 매개변수를 받는다. 모두 정수이고 t는 1에서 16 사이의 값을, n은 음수가 아니면서 0이 아닌 값을 받는다. a는 음수가 아니여야 한다.

t는 값에 따라 대응하는 값이 달라진다. 1은 4, 2는 12, 3은 40이고 t가 4부터는 1씩 증가할때마다 이전 t에 대응되는 값의 4배가 된다. 예외로 t가 16일때는 대응되는 값이 1,000,000,000,000이다. 그 이외에 값은 에러다.


출력은 실수형이고, t에 대응하는 값을 n번 곱하고 이 값으로 a를 나눈다.


간단하게는 미리 리스트를 만들어두고 계산식만 돌리면 끝나지 않을까 했어. 다른 방법이 있지 않을까 검색해보긴 했는데 그냥 리스트를 쓰거나 if 체인을 쓰라고 하더라고... 난 결국 if 문과 계산식을 적절히 섞어서 해결했어. 완벽히 깔끔하게 했다고는 못하겠지만 :


def foo(t, n, a):

if t<1 or t>16 or n < 0:

return -1

elif t == 1:

return a/4*n

elif t == 2:

return a/12*n

elif t > 2 and t < 16:

return a/(((t-3)<<1)*n)


이렇게 구현했는데 혹시 더 나은 방법이 있을까? 아니면 처음에 생각한 리스트에다 미리 값을 넣어두고 계산식만 돌리는게 더 깔끔할까?