프로그래밍 면접에서 가장 자주 등장하는 고전 문제 중 하나인 FizzBuzz를 파이썬으로 해결하는 방법을 알아보겠습니다.
문제 정의
숫자 n이 주어졌을 때, 1부터 n까지의 모든 숫자를 문자열 형태로 출력해야 합니다. 단, 다음과 같은 규칙이 적용됩니다.
- 숫자가 3으로 나누어 떨어지면 숫자 대신 "Fizz"를 출력합니다.
- 숫자가 5로 나누어 떨어지면 숫자 대신 "Buzz"를 출력합니다.
- 숫자가 3과 5 모두로 나누어 떨어지면 숫자 대신 "FizzBuzz"를 출력합니다.
해결 접근 방법
이 문제는 조건문의 순서가 핵심입니다. 다음 단계를 따라 해결할 수 있습니다.
- 1부터 n까지의 모든 숫자에 대해 다음을 검사합니다.
- 3과 5로 모두 나누어 떨어지면 "FizzBuzz"를 출력
- 그렇지 않고 3으로만 나누어 떨어지면 "Fizz"를 출력
- 그렇지 않고 5로만 나누어 떨어지면 "Buzz"를 출력
- 어떤 조건에도 해당하지 않으면 숫자를 그대로 문자열로 출력
주의할 점: 3과 5로 모두 나누어 떨어지는 경우(즉, 15의 배수)를 가장 먼저 검사해야 합니다. 그렇지 않으면 15의 배수가 "Fizz" 또는 "Buzz"로 잘못 출력될 수 있습니다.
구현 예제
다음 코드를 통해 더 잘 이해해 보겠습니다.
class Solution(object):
def fizzBuzz(self, n):
"""
:type n: int
:rtype: List[str]
"""
result = []
for i in range(1, n+1):
if i % 3 == 0 and i % 5 == 0:
result.append("FizzBuzz")
elif i % 3 == 0:
result.append("Fizz")
elif i % 5 == 0:
result.append("Buzz")
else:
result.append(str(i))
return result
ob1 = Solution()
print(ob1.fizzBuzz(30))입력
30
출력
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz", "13","14","FizzBuzz","16","17","Fizz","19","Buzz","Fizz","22","23", "Fizz","Buzz","26","Fizz","28","29","FizzBuzz"]
코드 설명
위 코드의 동작 방식을 단계별로 살펴보겠습니다.
- result 리스트 초기화: 결과를 저장할 빈 리스트를 생성합니다.
- 반복문:
range(1, n+1)을 사용해 1부터 n까지 순회합니다.n+1인 이유는 파이썬의 range 함수가 끝값을 포함하지 않기 때문입니다. - 조건 검사: 나머지 연산자
%를 사용해 3과 5로 나누어 떨어지는지 확인하고, 조건에 맞는 문자열을 리스트에 추가합니다. - 문자열 변환: 일반 숫자는
str(i)를 통해 문자열로 변환하여 저장합니다.
시간 복잡도
이 알고리즘의 시간 복잡도는 O(n)입니다. 1부터 n까지 각 숫자를 한 번씩만 검사하면 되기 때문입니다. 공간 복잡도 역시 결과 리스트의 크기가 n에 비례하므로 O(n)입니다.
마무리
FizzBuzz는 단순해 보이지만 조건문의 순서, 나머지 연산, 문자열 변환 등 기본기를 점검할 수 있는 좋은 문제입니다. 면접 준비나 파이썬 문법 연습을 위해 직접 코드를 작성해 보시기 바랍니다.