Fizz, Buzz, FizzBuzz 출력

Jeongyun Heo·2021년 1월 10일
0

Python

목록 보기
25/36
post-thumbnail

20.1 1부터 100까지 숫자 출력하기
https://dojang.io/mod/page/view.php?id=2265

FizzBuzz 문제

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

반복문, 조건문, 나머지 연산자, 비교 연산자를 모두 동원해야 풀 수 있다.

i = 0
while i < 100:
    i += 1
    if i % 3 == 0 and i % 5 == 0:
        print('FizzBuzz')
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)

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

1부터 100까지 숫자 출력하기

먼저 1부터 100까지 숫자를 출력해보자.

for i in range(1, 101):  # 1부터 100까지 (100번 반복)
    print(i)

--------------------------
1
2
3
... (생략)
98
99
100

for와 range로 1부터 100까지 100번 반복하면서 print로 변수의 값을 출력하면 된다. range에서 반복되는 마지막 숫자는 끝나는 숫자보다 1이 더 작으므로 101을 지정한다.

3의 배수일 때와 5의 배수일 때 처리하기

3의 배수와 5의 배수일 때 숫자 대신 'Fizz', 'Buzz'를 출력한다.

for i in range(1, 101):  # 1부터 100까지 100번 반복
    if i % 3 == 0:       # 3의 배수일 때
        print('Fizz')    # Fizz 출력
    elif i % 5 == 0:     # 5의 배수일 때
        print('Buzz')    # Buzz 출력
    else:
        print(i)         # 아무것도 해당되지 않을 때 숫자 출력

----------------------------
1
2
Fizz
... (생략)
97
98
Fizz
Buzz

3과 5의 공배수 처리하기

논리 연산자 and를 사용한다.

for i in range(1, 101):         # 1부터 100까지 100번 반복
    if i % 3 == 0  and i % 5 == 0:  # 3과 5의 공배수일 때
        print('FizzBuzz')       # FizzBuzz 출력
    elif i % 3 == 0:            # 3의 배수일 때
        print('Fizz')           
    elif i % 5 == 0:            # 5의 배수일 때
        print('Buzz')
    else:
        print(i)                # 아무것도 해당되지 않을 때 숫자 출력

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

if i % 3 == 0 and i % 5 == 0:이 제일 앞에 있어야 함

논리 연산자를 사용하지 않고 3과 5의 공배수 처리하기

논리 연산자 and를 사용하지 않고 15의 배수일 때 'FizzBuzz' 출력으로 하면 됨.

for i in range(1, 101):     # 1부터 100까지 100번 반복
    if i % 15 == 0:         # 15의 배수일 때
        print('FizzBuzz')   # FizzBuzz 출력
    elif i % 3 == 0:
        print('Fizz')
    elif i % 5 == 0:
        print('Buzz')
    else:
        print(i)            # 아무것도 해당되지 않으면 숫자 출력

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

FizzBuzz는 문제가 간단해서 15가 3과 5의 최소공배수라는 것을 쉽게 알 수 있다. 하지만 실무에서는 i % 3 == 0 and i % 5 == 0처럼 의미를 명확하게 드러내는 것이 좋다.

요즘은 프로그래밍 언어의 성능도 좋아졌고, CPU도 매우 빨라졌으므로 사소한 부분에 신경쓰기 보다는 가독성을 높이는 쪽으로 코드를 작성한다.

읽기 쉽고 이해하기 쉬운 코드로 작성한다.

다른 사람이 내 코드를 유지보수하기 쉽도록 코드를 작성해야 하고, 내가 만든 코드를 나중에 내가 봤을 때도 이해하기 쉽도록 작성해야 한다.

코드 단축하기

이번에는 코드를 매우 단축하여 '코드 골프 방식'으로 작성해보자.

문자열 곱셈과 덧셈을 이용하여 print 안에서 처리한다.

for i in range(1, 101):
    print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)

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

코드 골프는 소스 코드의 문자 수를 최대한 줄여서 작성하는 놀이다. (코드의 문자 수를 얼마나 줄일 수 있는지 겨루는 놀이일 뿐 실무에서 이런 방식으로 작성하면 나중에 작성자 본인을 포함해서 여러 사람이 고생하게 된다).

파이썬은 문자열을 곱하거나 더할 수 있다. 문자열을 곱하면 문자열이 반복되고, 문자열을 더하면 두 문자열이 연결된다.

문자열에 True를 곱하면 문자열이 그대로 나온다.

print('Fizz' * True)
-----------------------
Fizz

문자열에 False를 곱하면 문자열이 출력되지 않는다.

print('Fizz' * False)
------------------------
(아무것도 안 나옴)

'Fizz' * (i % 3 == 0)
문자열 곱셈을 이용하여 3의 배수일 때 'Fizz'를 출력한다.
i가 3의 배수이면 True이므로 'Fizz'가 출력된다.
3의 배수가 아니면 False이므로 아무것도 출력되지 않는다.

'Buzz' * (i % 5 == 0)
마찬가지로 'Buzz'도 문자열 곱셈을 이용하여 5의 배수일 때 True이므로 출력이 된다.

'Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0)
3과 5의 공배수일 때는 'FizzBuzz'를 출력해야 하는데 이때는 문자열 덧셈을 이용한다.

print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)
3 또는 5의 배수가 아닐 때는 'Fizz' * False + 'Buzz' * False가 되고 결과는 빈 문자열 ''이 되는데, 이때는 or 연산자를 사용하여 i를 출력한다.

연습문제: 2과 11의 배수, 공배수 처리하기

다음 소스 코드를 완성하여 1부터 100까지의 숫자를 출력하면서 2의 배수일 때는 'Fizz', 11의 배수일 때는 'Buzz', 2과 11의 공배수일 때는 'FizzBuzz'가 출력되게 만드세요.

for i in range(1, 101):
    if i % 2 == 0 and i % 11 == 0:
        print('FizzBuzz')
    elif i % 2 == 0:
        print('Fizz')
    elif i % 11 == 0:
        print('Buzz')
    else:
        print(i)

---------------------------------------
1
Fizz
3
... (생략)
FizzBuzz
89
Fizz
91
Fizz
93
Fizz
95
Fizz
97
Fizz
Buzz
Fizz

심사문제: 5와 7의 배수, 공배수 처리하기

표준 입력으로 정수 두 개가 입력됩니다(첫 번째 입력 값의 범위는 1~1000, 두 번째 입력 값의 범위는 10~1000이며 첫 번째 입력 값은 두 번째 입력 값보다 항상 작습니다). 첫 번째 정수부터 두 번째 정수까지 숫자를 출력하면서 5의 배수일 때는 'Fizz', 7의 배수일 때는 'Buzz', 5와 7의 공배수일 때는 'FizzBuzz'를 출력하는 프로그램을 만드세요(input에서 안내 문자열은 출력하지 않아야 합니다).

num = input().split()
num1 = int(num[0])
num2 = int(num[1])

for i in range(num1, num2+1):
    if i % 5 == 0 and i % 7 == 0:
        print('FizzBuzz')
    elif i % 5 == 0:
        print('Fizz')
    elif i % 7 == 0:
        print('Buzz')
    else:
        print(i)

-------------------------------------
35 40 (입력)
FizzBuzz
36
37
38
39
Fizz

먼저 정수 두 개가 한 줄에 입력되므로 input에서 split을 사용한 뒤 변수 두 개에 저장해주면 됩니다(변수는 이하 start, stop). 이때 input().split()의 결과는 문자열 상태이므로 map에 int를 사용하여 정수로 변환해줍니다.

num = tuple(map(int,input().split()))  # 튜플로 만들어준다.
start, stop = num
print(start)
print(stop)

----------------------------------------
35 40 (입력)
35
40

입력한 첫 번째 정수에서 두 번째 정수까지 숫자를 출력하려면
for i in range(start, stop + 1):와 같이 반복문을 작성하면 됩니다.

공배수일 때 'Fizz'나 'Buzz'가 출력되지 않도록 항상 공배수 처리를 먼저 해줍니다.

0개의 댓글