FizzBuzz 문제

FizzBuzz 문제로 알려진 공간 주변에 매우 인기 있는 문제가 있습니다. 이 문제에서 우리가 해야 할 일은 1에서 n까지 반복해야 한다는 것입니다. 3으로 나눌 수 있는 정수를 만날 때마다 Fizz 를 인쇄해야 하고, 5로 나눌 수 있는 정수를 만날 때마다 Buzz & 및 정수가 3과 5로 나눌 수 있는 경우 "FizzBuzz"를 인쇄해야 합니다. 소프트웨어 개발자 면접에서 후보자가 실제로 코드를 작성할 수 있는지 여부를 결정하는 데 사용되는 매우 간단한 프로그래밍 작업입니다. 그것은 Imran Ghory에 의해 발명되었고 Jeff Atwood에 의해 대중화되었습니다.

그래서 좋은 문제를 만드는 것은 ...

프로그래머가 작성하는 경우입니다.

def FizzBuzz():
    for i in range(1, 100):
        if i == 0:
            continue
        elif i % 15 == 0:
            print('FizzBuzz')
        elif i % 5 == 0:
            print('Buzz')
        elif i % 3 == 0:
            print('Fizz')
        else:
            print(i)

이것은 솔루션을 인쇄하는 작업을 수행합니다. 하지만 여기에 함정이 있습니다 ...

모듈로 연산자(%)는 무거운 연산자이며 다른 방식으로 작동합니다. i % 15라고 말하면 i % 5 && i % 3 로 표시됩니다. 따라서 FizzBuzz 프로그램에서 i % 15를 수행하는 경우 i % 5 작업을 두 번 수행합니다.

따라서 이 문제를 해결하기 위해 일부 프로그래머는 이 문제에 다른 방식으로 접근합니다.

그들의 접근 방식은

def FizzBuzz():
    f = False
    d = ""
    for i in range(1, 10000):
        if i % 3 == 0:
            d += 'Fizz'
            f = True
        if i % 5 == 0:
            d += 'Buzz'
            f = True
        if f != True:
            print(i)
        else:
            print(d)
            d = ""
            f = False

여기서 그들은 i % 3 & i % 5를 한 번만 확인하고 'Fizz' & 'Buzz' 문자열을 빈 문자열에 추가합니다. 그리고 마지막에는 숫자나 마지막 문자열만 출력합니다.

이 접근 방식은 처리 시간을 줄여주지만 메모리 소비를 증가시킵니다.

드문 최종 접근 방식은 ...

def FizzBuzz():
    c3 = 0
    c5 = 0
    d = ""
    b = False
    for num in range(1, 10000):
        c3 += 1
        c5 += 1
        if c3 == 3:
            d += "fizz"
            c3 = 0
            b = True
        if c5 == 5:
            d += "buzz"
            c5 = 0
            b = True
        if b == True:
            print(d)
            d = ""
            b = False
        else:
            print(num)

여기 이 접근 방식에서는 (%) 모듈로 연산자가 사용되지 않습니다. 따라서 코드의 처리 시간을 줄입니다.

테스트



이 이론을 테스트하기 위해 Python 시간 함수를 구현했는데 놀랍게도. 첫 번째 코드와 마지막 코드 사이에 엄청난 시간 차이가 있었습니다.

타이밍 결과는 다음과 같습니다 ...

100개 항목의 경우



  • 첫 번째 버전 0.0005862250000000027

  • 두 번째 버전 0.0002485049999999961

  • 세 번째 버전 0.001852885999999998

  • 10000개 항목의 경우



  • 첫 번째 버전 0.117162348

  • 두 번째 버전 0.188121156

  • 세 번째 버전 0.401831502

  • 어디에서 막히면 댓글을 남겨주세요.
    Twitter에서 나를 팔로우하세요.
    Githubgithub/pranjaljain0에서 나를 팔로우하세요.

    전체 코드를 보려면 이 요지로 이동하십시오.




    해킹을 즐기세요!

    좋은 웹페이지 즐겨찾기