20.1 1부터 100까지 숫자 출력하기
https://dojang.io/mod/page/view.php?id=2265
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까지 숫자를 출력해보자.
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의 배수일 때 숫자 대신 '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
논리 연산자 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:
이 제일 앞에 있어야 함
논리 연산자 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를 출력한다.
다음 소스 코드를 완성하여 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
표준 입력으로 정수 두 개가 입력됩니다(첫 번째 입력 값의 범위는 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'가 출력되지 않도록 항상 공배수 처리를 먼저 해줍니다.