FizzBuzz
FizzBuzz 세기 게임에서 플레이어들은 1부터 세어 가며 일부 숫자를 단어로 바꿉니다. 차례 번호 n이 주어졌을 때, 그 차례에 플레이어가 말하는 것을 반환하세요. n이 3과 5 모두로 나누어떨어지면 "FizzBuzz", 3으로만 나누어떨어지면 "Fizz", 5로만 나누어떨어지면 "Buzz"를 반환하고, 어느 쪽에도 해당하지 않으면 "7"과 같이 n 자체를 문자열로 반환합니다.
함수
- ninteger
- 턴 번호, 양의 정수
- 반환값string
- 턴 n에서 말하는 단어나 숫자(문자열로)
제약 조건
1 ≤ n ≤ 109- 답은 숫자 자체일 때도 항상 문자열입니다.
예제
- 입력
- n = 15
- 출력
- "FizzBuzz"
- 설명
- 15를 3으로 나누면 5이고 15를 5로 나누면 3이며, 둘 다 나머지가 없으므로 15번째 차례는
"FizzBuzz"입니다.
- 입력
- n = 7
- 출력
- "7"
- 설명
- 7은 3으로 나누면 나머지가 1이고 5로 나누면 나머지가 2이므로, 해당하는 단어가 없으며 숫자를 텍스트인
"7"로 반환합니다.
후속 질문
새 규칙은 7의 배수를 "Bazz"로 만들고, 단어는 순서대로 이어 붙이므로 105는 "FizzBuzzBazz"가 됩니다. 모든 조합에 대해 각각 조건을 만들지 않고 이 규칙을 어떻게 추가할 수 있을까요?
힌트
하나씩 열어 보세요. 열 때마다 조금 더 알려 줍니다.
나머지 연산자는 한 숫자가 다른 숫자로 나누어떨어지는지 알려 줍니다.
n은n을 3으로 나눈 나머지가 0일 때에만 3으로 나누어떨어집니다.15에 대해 생각해 보세요. 15는 3으로도 나누어떨어지고 5로도 나누어떨어집니다. 15가
"FizzBuzz"가 되고"Fizz"가 되지 않도록 하려면 어떤 검사를 먼저 실행해야 할까요?먼저 15로 나누어떨어지는지 확인한 다음, 3으로, 그다음 5로 나누어떨어지는지 확인하세요. 어느 것도 해당하지 않으면 숫자를 문자열로 변환하세요. 변환할 때 모든 자릿수가 기록되는지 확인하세요. 그래야 10^9가 과학적 표기법이 아니라
"1000000000"으로 표시됩니다.
풀이
각 규칙은 나머지를 확인하는 검사 하나입니다. 주의할 점은 순서입니다. 15는 3으로 나누어떨어지므로, 3을 먼저 검사하고 즉시 반환하는 함수는 15에 대해 "Fizz"라고 답합니다. 결합된 경우를 먼저 검사하거나, 두 검사 결과를 모두 사용해 답을 구성하세요.
두 검사를 모두 사용해 단어를 만드세요
핵심 아이디어
빈 단어로 시작하세요. 3이 n을 나누면 "Fizz"를 추가하고, 5가 n을 나누면 "Buzz"를 추가하세요. 두 검사는 항상 실행되므로, 15의 배수는 두 부분을 순서대로 모두 모아 특별한 경우 처리 없이 "FizzBuzz"가 됩니다. 단어가 여전히 비어 있다면 어느 규칙도 적용되지 않은 것이므로, 숫자를 문자열로 반환하세요.
알고리즘
word를 빈 문자열로 설정합니다.n % 3 == 0이면"Fizz"를 덧붙입니다.n % 5 == 0이면"Buzz"를 덧붙입니다.word가 비어 있으면,n을 문자열로 변환한 값을 반환합니다.- 그렇지 않으면
word를 반환합니다.
def fizzBuzz(n):
word = ""
if n % 3 == 0:
word += "Fizz"
if n % 5 == 0:
word += "Buzz"
# An empty word means neither 3 nor 5 divides n.
if word == "":
return str(n)
return word15를 확인한 다음, 3을 확인하고, 5를 확인하세요
핵심 아이디어
3과 5로 모두 나누어떨어지는 수는 정확히 15로 나누어떨어지는 수입니다. 3과 5는 공약수가 없기 때문입니다. 따라서 결합된 규칙은 n % 15 == 0이라는 하나의 검사이며, 이 검사를 가장 먼저 수행합니다. 이 검사가 실패한 다음에는 3으로 나누어떨어지면 3만 해당하고, 5로 나누어떨어지면 5만 해당합니다. 각 검사는 즉시 값을 반환하며, 어느 것도 일치하지 않으면 해당 수를 문자열로 반환합니다.
알고리즘
n % 15 == 0이면"FizzBuzz"를 반환합니다.n % 3 == 0이면"Fizz"를 반환합니다.n % 5 == 0이면"Buzz"를 반환합니다.- 그렇지 않으면
n을 문자열로 변환하고 모든 숫자를 문자로 써서 반환합니다.
def fizzBuzz(n):
if n % 15 == 0:
return "FizzBuzz"
if n % 3 == 0:
return "Fizz"
if n % 5 == 0:
return "Buzz"
return str(n)
함정과 경계 사례
- 15보다 먼저 3 또는 5를 검사하고 즉시 반환하면 15, 30, 45는
"Fizz"로 나옵니다. - 문자열 대신 숫자를 반환합니다. 7은
"7"입니다. - 큰 수를 과학적 표기법으로 변환합니다. R에서 일반적인 변환을 하면 10^9는
1e+09로 출력됩니다.format(n, scientific = FALSE)를 사용하세요. - 답을 반환하는 대신 출력합니다.
자주 묻는 질문3
코딩 면접에서 FizzBuzz를 묻는 이유는 무엇인가요?
짧은 규칙을 나머지 연산 검사, 올바른 순서의 조건문, 적절한 반환 유형을 사용해 작동하는 코드로 만들 수 있는지 확인합니다. 평소에 코딩하는 사람이라면 몇 분이면 풀 수 있으므로, 더 어려운 문제를 내기 전에 빠르게 실력을 확인하는 데 적합합니다.
모듈로 연산자 없이 FizzBuzz를 풀 수 있나요?
네. 정수 나눗셈으로 나눈 다음 몫을 다시 곱해 n과 비교하세요. 나머지가 없을 때만 서로 같습니다. 전체 수열을 출력할 때는 3과 5에서 초기화되는 카운터 두 개를 유지할 수도 있습니다.
FizzBuzz의 시간 복잡도는 얼마인가요?
숫자 하나에 대한 답을 구하는 것은 O(1)입니다. 나머지 연산을 고정된 횟수만큼 확인하고, 최대 10자리 숫자를 변환합니다. 1부터 n까지의 수열을 출력하는 것은 O(n)입니다.
비슷한 문제
같은 아이디어를 쓰는 문제입니다. 두세 개를 풀면 패턴이 몸에 익습니다.
def fizzBuzz(n):
# 여기에 코드를 작성하세요테스트 #1
테스트 #2
인자
n = 15
예상 출력
"FizzBuzz"