ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 비트 연산을 이용한 쿠폰 기능 구현
    programing/etc 2021. 8. 1. 23:58

    발단

    면접 질문을 정리하다가 쿠폰 기능 구현을 보고 생각난 것.

    쿠폰은 어느 경우엔 적용이 되고 어느 경우엔 적용이 안되고 같은 예외 케이스들이 엄청나게 많은데, 이걸 어떻게 우아하게 구현할 수 있을까?

    방법

    비트연산을 이용하면 우아하게 구현할 수 있지 않을까?

    예를들어 2진법으로 상품과 쿠폰이 다음과 같다고 가정하자.

    • 기본상품 : 1111
    • 특가할인 쿠폰 : 0001
    • 생일쿠폰 : 0011
    • 멤버십 쿠폰 : 0100

    특가 할인 쿠폰 적용

    이 상태에서 기본상품에 특가할인을 적용해보자.

    기본상품(1111)과 특가할인 쿠폰(0001) 을 and 연산을 하면 0001이 나오고, 이는 특가할인 쿠폰의 값(0001)과 동일하다. 동일한 값이라면 쿠폰 적용이 가능함을 의미한다.

    만약 쿠폰을 적용한다면, xor 연산을 한다. 따라서 기본상품(1111)과 특가할인 쿠폰(0001)을 xor 해서 1110이 나오게 된다.

    생일 쿠폰 적용

    이제 다음으로 생일쿠폰을 적용하려고 한다.

    위에서 나온 값인 1110과 생일쿠폰(0011)을 and 연산을 하면 0010으로, 생일쿠폰의 값(0011)과 다르다. 따라서 생일쿠폰은 적용이 불가능하다.

    멤버십 쿠폰 적용

    그럼 다음으로 멤버십 쿠폰을 적용해보자.

    생일 쿠폰이 적용되지 않았으므로, 그대로 1110과 멤버십 쿠폰(0100)을 and 연산을 하면 0100이 나온다. 0100은 멤버십 쿠폰의 값(0100)과 동일하므로 쿠폰 적용이 가능하다.

    쿠폰 적용을 한다면 1110과 0100을 xor하여 1010이 나온다.

    장점

    아무래도 각 연산의 순서는 상관없으므로, 각 쿠폰 간 적용 순서는 무관하다는 장점이 있다.

    쿠폰의 종류를 2^bit 수 만큼 만들 수 있다. JS의 Number.MAX_SAFE_INTEGER 는 2^53 - 1 (9,007,199,254,740,991)까지 표현이 가능하므로, 만들 수 있는 쿠폰 종류의 개수는 11111... 을 제외해서 2^53 - 2 (9,007,199,254,740,990)개이다.

    다만, 다른 쿠폰과 중복 적용 방지를 고려한다면 2^53 - 2 보다 적은 수만 가능 할 것이다.

    단점

    뭐가 있을까?

    댓글

Designed by black7375.