규도자 개발 블로그
피즈버즈 테스트(FizzBuzz Test) - 파이썬3(python3) 본문
피즈버즈 테스트(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 답이 나왔다. 대표적인 알고리즘 문제인 만큼 더더더 하는 욕심이 났다. 오랜만에 재미있었다.
'알고리즘 > 개념' 카테고리의 다른 글
재귀함수로 구하는 피보나치 수열의 직관성 (0) | 2021.10.28 |
---|---|
에라토스테네스의 체 (소수구하기. 파이썬) (2) | 2021.04.19 |
최대공약수(Greatest Common Divisor)와 최소공배수(Least Common Multiple) 구하기 - 파이썬3 (0) | 2021.03.31 |