파이썬 | FizzBuzz

CHOI·2021년 10월 25일
0

Python

목록 보기
11/33
post-thumbnail

FizzBuzz는 매우 간단한 프로그래밍 문제이며 규칙은 다음과 같다.

  1. 1에서 100까지 출력
  2. 3의 배수는 Fizz 출력
  3. 5의 배수는 Buzz 출력
  4. 3과 5의 공배수는 FizzBuzz 출력

1부터 100까지의 숫자를 출력하면서 3의 배수는 'Fizz', 5의 배수는 'Buzz', 3과 5의 공배수이면 'FizzBuzz'를 출력하면 된다.

1
2
Fizz
... (생략)
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz

위와 같은 방식으로 나오면 된다. 직접 한 번 만들어보자.

  • 내 답
    for i in range(1, 101):
    	if i % 3 == 0:
    		print("Fizz", end='')
    	if i % 5 == 0:
    		print("Buzz", end='')
    	if i % 3 != 0 and i % 5 != 0:
    		print(i, end='')
    	print()
  • 간단한 답
    for i in range(1, 101):
    	print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)
    위의 코드는 코드 골프 방식으로 작성하였다. 코드 골프란 골프에서 따온 말인데 골프는 누가 더 적은 타수인지에 따라서 승부가 결정된다. 마찬가지로 코드 골프도 소스 코드의 문자 수를 최대한 줄여서 작성하는 놀이이다. (이는 코드를 얼마나 더 줄일 수 있는지 겨루는 놀이일 뿐 실무에서 이렇게 하면 본인 뿐만 아니라 다른사람들도 많이 고생시킬 수 있기 때문에 사용하지 말자.) 먼저 파이썬에서는 문자열을 더하거나 곱할 수 있었다.
    >>> 'Fizz' + 'Buzz'
    'FizzBuzz'
    >>> 'Fizz' * True
    'Fizz'
    >>> 'Fizz' * False
    ''
    그렇기 떄문에 위와 같은 연산이 가능하다. i % 3 == 0 와 같은 논리식의 결과는 True 또는 False 로 나오는데 각각 1과 0이기 때문에 논리식이 참이면 문자열 * 1 을 하여 문자열이 나오고 반대로 거짓이면 문자열 * 0 을 하여 0 이 나오게 된다. 그리고 or 을 사용했는데 앞서 논리 연산에서 배웠듯이 파이썬에서 or 은 앞에가 참이면 뒤를 보지도 않고 끝낸다. 따라서 만약 'Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) 가 0 즉 아무값도 나오지 않는다면 or 뒷 부분인 i 가 출력이 되는 것이고 그 외의 값이 들어오면 i 는 출력이 되지 않고 앞부분만 보기 때문에 FizzBuzz 또는 FizzBuzz 가 나오게 된다. FizzBuzz 문제는 간단하면서 조금 까다로운 문제이다. 이 문제는 실제로 회사 면접 문제로도 많이 나오는데 의외로 경력있는 프로그래머들도 문제를 틀린다. 너무 쉽게 보다가 3과 5의 공배수에 관한 부분에서 처리 실수가 나오는 경우가 있기 때문이다. FizzBuzz 문제는 프로그래밍 실력을 보기 보다는 이해력을 보는 문제이다. 프로그래밍 실력보다 중요한 것이 이해력이라는 점을 놓치지 말자.
profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글