규도자 개발 블로그

피즈버즈 테스트(FizzBuzz Test) - 파이썬3(python3) 본문

알고리즘/개념

피즈버즈 테스트(FizzBuzz Test) - 파이썬3(python3)

규도자 (gyudoza) 2019. 2. 12. 23:12

피즈버즈 테스트(FizzBuzz Test)

피즈버즈테스트(FizzBuzz Test)라고 해서 프로그래머의 역량을 간단하게나마 평가하는 알고리즘 문제가 있다. 훌륭한 프로그래머라면 2분 이내에 정확히 작동하는 코드를 작성할 수 있다고 한다.

FizzBuzz 문제는 옛날 TV에서 하던 삼육구 + 아자랑 비슷한데, 삼육구 + 아자는 숫자에 3이 들어가거나 5가 들어가면 박수를 치고 아자를 외쳐야하는 반면 Fizzbuzz문제는 1부터 100까지 1씩 커지는 수열에서 3의 배수때는 Fizz, 5의 배수일때는 Buzz, 3과 5의 공배수일 때는 FizzBuzz를 출력하게 하고 위 세개의 모든 경우에도 들지 않으면 숫자 그대로를 출력해야 한다.

간단해보이는 이 문제가 왜 프로그래밍 테스트의 대표격이 됐을까. 사실 이 FizzBuzz문제는 훌륭한 프로그래머를 가린다기보다 프로그래밍을 못하는 사람을 가려내기 위해 고안되었기 때문이다.
 서문에 훌륭한 프로그래머라면 2분 안에 답을 작성한다는 사실이 강조되었지만 반대로 이 문제의 이면에는 대부분의 컴퓨터과학 전공학과 학생들이 아예 문제를 제대로 풀지 못했을 뿐더러 몇 몇 시니어 개발자들도 10분이 넘는 시간이 걸렸다는 사실이 깔려있다. 그래서 보통 원격 면접 등을 볼 때 간단하게 묻는 문제가 된 것인데 해당 문제에 대한 프로그래머가 제시한 답을 듣다 보면 실제로 프로그래밍을 할 줄 아는 사람과 모르는 사람을 가려낼 수가 있다는 것이 이 FizzBuzz문제의 요지이다.


쉽게 생각할 수 있는 답

for number in range(1, 101):
    output = number
    if(number % 3 == 0):
        output = 'Fizz'
    if(number % 5 == 0):
        output = 'Buzz'
    if(number % 15 == 0):
        output = 'FizzBuzz'
    print(output)

그냥 문제를 들었을 때 가장 빨리 풀어야겠다 싶으면 이렇게 할 것이다. 근데 왠지 Fizz와 Buzz가 두 번씩 들어가는게 마음에 들지 않는다. 반복을 없애보자.



반복을 없애고 읽기 쉽게 만든 것

for number in range(1, 101):
    devided = False
    if(number % 3 == 0):
        print('Fizz', end='')
        devided = True
    if(number % 5 == 0):
        print('Buzz', end='')
        devided = True
    if(not devided):
        print(number, end='')

Fizz와 Buzz가 한 번만 들어갔지만 나눠진 값인지 아닌지 아래단계에선 판별이 되지 않아 flag변수를 넣었는데 마음에 들지 않는다. 아예 하나의 조건문에 때려 박으면 한 줄에 표현이 될 것 같다.

for number in range(1, 101):
    print('Fizz' * (not number % 3) + 'Buzz' * (not number % 5) or number)

여기까지왔으면 파이썬의 꽃, 컴프리헨션을 쓸 수 있겠다.

FizzBuzz = ['Fizz' * (not number % 3) + 'Buzz' * (not number % 5) or number for number in range(1, 100)]

자 이렇게 해서 드디어 만족스러울만한 FizzBuzz 답이 나왔다. 대표적인 알고리즘 문제인 만큼 더더더 하는 욕심이 났다. 오랜만에 재미있었다.

Comments