Unit 20. FizzBuzz문제
20.1 1 부터 100 까지 숫자 출력하기
for 반복문을 이용하여 다음과 같이 1부터 100까지 반복해주면 된다.
for i in range(1,101):
print(i)
반복 되는 마지막 숫자는 끝나는 숫자보다 1 작으므로 101 을 넣어주면 된다.
20.2 3의 배수일 때와 5의 배수일 때 처리하기
다음 코드는 3의 배수일 때는 Fizz를, 5의 배수일 때는 Buzz를, 나머지 숫자는 숫자를 출력하는 코드이다.
for i in range(1,101):
if i % 3 == 0:
print('Fizz')
elif i % 5 == 0:
print('Buzz')
else:
print(i)
3의 배수는 i를 3으로 나눴을때 나머지가 0 이며 5의 배수는 i를 5로 나눴을 때 나머지가 0이다. 이 두 경우에 해당하지 않으면 숫자를 출력한다.
20.3 3과 5의 공배수 처리하기
위의 코드는 공배수일 경우 3의 배수인 Fizz가 출력된다. 3과 5의 공배수를 처리 하려면 다음 코드와 같다.
for i in range(1,101):
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)
and 연산으로 3의 배수와 5의 배수 동시에 만족시키는 경우를 처리해 줘야 한다. if의 조건식이 만족하면 뒤의 elif의 조건식은 검사하지 않기 때문에 공배수를 처리하는 조건식은 반드시 if에 들어가야 함을 주의해야 한다.
20.4 논리 연산자를 사용하지 않고 3과 5의 공배수 처리하기
3과 5의 최소공배수는 15이기 때문에 15의 배수도 3과 5의 공배수이다. 그래서 다음과 같이 코드를 수정하면 된다.
for i in range(1,101):
if i % 15 == 0:
print('FizzBuzz')
elif i % 3 == 0:
print('Fizz')
elif i % 5 == 0:
print('Buzz')
else:
print(i)
결과 값은 위와 같다. 15라는 숫자는 3과 5의 최소공배수라는 의미를 담고 있는데, 이를 명확하게 들어내기 위해 20.3의 방식으로 하는것이 더 좋은 방법이긴 하다.
20.5 코드 단축하기
다음과 같이 코드를 단축하여 문제를 해결할 수도 있다.
for i in range(1, 101):
print('Fizz' * (i % 3 == 0) + 'Buzz' * (i % 5 == 0) or i)
결과값은 위의 값들과 같다.
위 예시와 같이 문자열에 False를 곱하면 아무것도 출력되지 않고, 문자열에 True를 곱하면 문자열이 그대로 출력된다. 또한 or 연산은 둘다 참이면 앞의 것을 출력하기 때문에 3의 배수 이면 Fizz를, 5의 배수이면 Buzz를, 3과 5의 공배수면 FizzBuzz를, 모두 아니면 숫자를 출력하게 된다.
20.6 퀴즈
정답은 d이다.
정답은 d,e 이다.
20.7 연습문제: 2와 11의 배수, 공배수 처리하기
정답은 다음과 닽다.
1. i % 2 == 0 and i % 11 == 0
2. i % 2 == 0
3. i % 11 == 0
20.8 심사문제: 5와 7의 배수, 공배수 처리하기
정답은 다음 코드와 같다.
start, stop = map(int, input().split())
for i in range(start, stop+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)
Unit 21. 터틀 그래픽스로 그림 그리기
터틀은 거북이가 기어가는 모양대로 그림을 그리는 모듈이다.
21.1 사각형 그리기
터틀은 다음과 같이 터미널에서 실행할 수 있다.
t.shape()는 거북이의 모양을 설정하며, 아무 값도 설정하지 않으면 화살표가 나온다.
위와 같은 명령어를 입력하면 거북이를 100픽셀 만큼 앞으로 이동시킨다.
거북이가 오른쪽으로 이동했고, 검은 선이 그려진 것을 확인할 수 있다.
다음 코드를 입력하면 거북이의 방향을 오른쪽으로 90도 회전시킨다. 각도에 다른 숫자를 지정하면 해당 각도 만큼 방향이 바뀐다.
이렇게 앞으로 100픽셀 가고, 거북이의 방향을 바꾸는 행위를 계속 하며 거북이를 조종하여 사각형을 그릴 수 있다.
앞으로 이동, 오른쪽으로 회전 외에도 뒤로이동, 왼쪽으로 회전 등도 가능하며 다음과 같이 코드를 줄여 쓸 수도 있다.
- 앞으로 이동: forward, fd
- 뒤로 이동: backward, bk, back
- 왼쪽으로 회전: left, lt
- 오른쪽으로 회전: right, rt
위에 그린 사각형을 fd와 rt를 이용하여 작성한 코드는 다음과 같다.
import turtle as t
t.shape('turtle')
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)
t.rt(90)
t.fd(100)
스크립트 파일을 실행시 터틀 창이 바로 사라지는 경우가 생긴다면 다음 코드를 스크립트 파일 마지막 부분에 추가하면 된다.
t.mainloop()
21.2 다각형 그리기
다음과 같이 반복문을 사용하여 사각형을 그릴 수도 있다.
import turtle as t
t.shape('turtle')
for i in range(4):
t.forward(100)
t.right(90)
t.mainloop()
결과물이 나오자마자 바로 사라졌기 때문에 mainloop를 추가하였다.
21.1.1 오각형 그리기
다각형에서 외각의 합은 항상 360도이기 때문에 하나의 외각은 360을 5로 나누면 된다. 소스코드는 다음과 같다.
import turtle as t
t.shape('turtle')
for i in range(5):
t.forward(100)
t.right(360 / 5)
t.mainloop()
오각형이기 때문에 5번 반복 하였다.
21.1.2 다각형 그리기
다음과 같이 사용자로부터 입력을 받아 해당 숫자에 해당하는 다각형을 그릴 수 있다.
import turtle as t
n = int(input())
t.shape('turtle')
for i in range(n):
t.forward(100)
t.right(360 / n)
t.mainloop()
위는 6을 입력하여 육각형을 그린 예시이다.
21.2.3 다각형에 색칠하기
다음은 빨간색으로 색칠된 육각형을 그리는 코드이다.
import turtle as t
t.shape('turtle')
t.color('red')
t.begin_fill()
for i in range(6):
t.forward(100)
t.right(360 / 6)
t.end_fill()
t.mainloop()
t.color()로 펜의 색을 지정하고, 도형을 그리기 전에 t.begin_fill()로 색칠할 준비를 한다. 도형이 그려진 후에는 t.end_fill()을 이용하여 도형 전체에 펜 색이 칠해진다.
21.3 복잡한 도형 그리기
터틀에서 원을 그릴 때는 circle() 함수를 사용하면 된다. 괄호 안에는 반지름의 길이가 들어간다.
21.3.1 원을 반복해서 그리기
다음은 for을 사용해서 원을 반복해서 그리는 코드이다.
import turtle as t
n = 60
t.shape('turtle')
t.speed('fastest')
for i in range(n):
t.circle(120)
t.right(360 / n)
t.mainloop()
speed()는 거북이의 속도를 설정할 수 있다. 속도는 다음과 같이 문자열이나 숫자로 설정할 수 있다. 숫자는 0.5에서 10 까지 설정할 수 있다.
- 'fastest' : 0
- 'fast' : 10
- 'normal' : 6
- 'slow' : 3
- 'slowest' : 1
21.3.2 선으로 복잡한 무늬 그리기
import turtle as t
t.shape('turtle')
t.speed('fastest')
for i in range(300):
t.forward(i)
t.right(91)
t.mainloop()
반복문으로 선의 길이가 0 부터 299까지 점점 길어지게 반복되고, 91도씩 회전하면서 미세하게 틀어진 사각형이 그려지면서 바깥쪽으로 퍼져나간다.
터틀의 모양으로 설정할 수 있는 것은 'arrow', 'turtle', 'circle', 'square', 'triangle', 'classic' 등이 있다.
21.4 퀴즈
정답은 d 이다. lt는 왼쪽으로 회전하는 것이다.
정답은 d이다.
21.5 연습문제: 오각별 그리기
t.forward(100)
t.right(72*2)
t.forward(100)
t.left(72)
문제 설명을 따라서 코드를 작성하면 문제를 해결할 수 있다.
21.6 심사문제: 별 그리기
정답은 다음 코드와 같다.
for i in range(n):
t.fd(line)
t.rt((360/n)*2)
t.fd(line)
t.lt(360/n)
Unit 22. 리스트와 튜플 응용하기
22.1 리스트 조작하기
22.1.1 리스트에 요소 추가하기
리스트에 요소를 추가하는 메서드는 다음 3가지가 있다.
- append: 요소 하나를 추가
- extend: 리스트를 연결하여 확장
- insert: 특정 인덱스에 요소 추가
22.1.2 리스트에 요소 추가하기
append(요소)는 리스트에 요소 하나를 추가한다.
위 코드들을 보면 리스트에 50이라는 요소가 추가된 것을 확인할 수 있다. 또한 다음과 같이 빈 리스트에도 값을 추가할 수 있다.
22.1.3 리스트 안에 리스트 추가하기
append()안에 리스트를 넣으면 리스트 안에 리스트가 들어가는 중첩리스트가 된다. append()로 추가된 요소들의 길이는 항상 1이다.
22.1.4 리스트 확장하기
리스트에 요소를 여러 개 추가할 때는 extend()를 사용한다. extend() 안에는 리스트가 들어가며 그 리스트의 요소들이 추가된다.
extend를 사용하면 리스트의 길이는 extend에 전달된 리스트의 길이만큼 증가한다. extend에 전달된 리스트의 요소들을 반복하면서 각 요소들을 리스트 a에 추가하는 것이다.
22.1.5 리스트의 특정 인덱스에 요소 추가하기
원하는 위치에 요소를 추가하고 싶을 때는 insert()를 사용한다. insert(인덱스, 요소)의 형식으로 사용하며 특정 인덱스에 요소 하나를 추가한다.
a의 2번 인덱스에 200이 추가된 것을 확인할 수 있다.
insert()에서 자주 사용되는 패턴은 다음 두 가지 이다.
- insert(0, 요소): 리스트의 맨 처음에 요소를 추가
- insert(len(리스트), 요소): 리스트 끝에 요소를 추가
len(리스트)는 마지막 인덱스보다 1 크기 때문에 리스트의 마지막에 값이 추가된다.
insert()에 리스트를 넣으면 리스트 안에 리스트가 들어가는 중첩 리스트의 형태가 된다.
리스트 중간에 요소를 여러개 추가하려면 슬라이스를 이용하면 된다. 다음과 같이 시작 인덱스와 끝 인덱스 같게 하면 해당 인덱스의 요소를 덮어쓰지 않고도, 요소 여러개를 중간에 추가할 수 있다.
22.1.6 리스트에서 요소 삭제하기
리스트에서 요소를 삭제하는 방법은 다음 두 가지가 있다.
- pop : 마지막 요소 또는 특정 인덱스의 요소를 삭제
- remove : 특정 값을 찾아서 삭제
22.1.7 리스트에서 특정 인덱스의 요소를 삭제하기
pop()은 리스트의 마지막 요소를 삭제한 뒤 삭제한 요소를 반환한다.
pop() 괄호 안에 원하는 인덱스를 지정하면 그 인덱스에 해당하는 요소를 삭제한 뒤 반환한다. pop()대신 del 을 사용해도 상관 없다.
22.1.8 리스트에서 특정 값을 찾아서 삭제하기
리스트에서 원하는 값을 찾아서 삭제할 때는 remove()를 사용한다. remove(값)은 특정 값을 찾아서 삭제한다.
리스트에 같은 값이 여러개 있을 경우 처음 찾은 값만 삭제한다.
리스트로 스택과 큐 만들기
append와 pop호출 형태를 90도로 돌려서 세로로 만들면 스택이되고, pop()대신 pop(0)을 사용하면 큐가 된다. 파이썬에서 스택은 리스트로 사용해도 되지만, 큐는 더 효율적으로 사용할 수 있도록 덱(deque, Double Ended QUEue)이라는 자료형을 제공한다. 덱은 양쪽 끝에서 추가, 삭제가 가능한 자료 구조이다.
collections 모듈에서 deque를 가져와야 한다. append()는 덱의 오른쪽에 요소를 추가하고, popleft()는 덱의 왼쪽 요소를 삭제한다. appendleft()로 덱의 왼쪽에 요소를 추가할 수도 있고, pop()로 덱의 오른쪽 요소를 삭제할 수도 있다.
22.1.9 리스트에서 특정 값의 인덱스 구하기
index(값)은 리스트에서 특정 값의 인덱스를 구한다. 같은 값이 여러개일 경우 가장 처음 찾은 값의 인덱스를 반환한다.
22.1.10 특정 값의 개수 구하기
count(값)으로 리스트 안의 특정 값의 개수를 구할 수 있다.
a에는 2가 4개 들어 있어 4가 반환되었다.
22.1.11 리스트의 순서를 뒤집기
reverse()는 리스트 내 요소의 순서를 반대로 뒤집는다.
22.1.12 리스트의 요소를 정리하기
sort()는 리스트의 요소를 오름차순으로 정렬한다. sort(reverse=True)는 리스트의 요소를 내림차순으로 정렬한다.
리스트의 요소를 정렬하는 함수는 sorted()도 있다. sort()는 사용한 리스트를 변형시키지만, sorted()는 새로운 리스트를 생성하여 정렬한다.
22.1.13 리스트의 모든 요소를 삭제하기
clear()은 리스트의 모든 요소를 삭제하여 빈 리스트를 만든다.
del a[:]과 같이 시작리스트와 끝 리스트를 모두 생략하여 del로도 모든 요소를 삭제할 수 있다.
22.1.14 리스트를 슬라이스로 조작하기
메서드를 사용하지 않고, 슬라이스로 조작할 수도 있다.
위 코드는 슬라이스를 사용하여 리스트 끝에 값을 하나 추가했다. len(a)는 리스트의 마지막 인덱스 보다 1 크기 때문에 리스트 끝에 값을 추가할 수 있다. 이때는 인덱스의 범위를 벗어난 리스트를 사용할 수 있다.
리스트 끝에는 여러개의 요소를 추가할 수 도 있다.
리스트가 비어있는지 확인하려면 len으로 확인할 수 도 있지만 리스트를 바로 if 조건문으로 판단이 가능하다.
if not seq: # 리스트가 비어 있으면 True
if seq: # 리스트에 내용이 있으면 True
리스트 인덱스에서 -1은 리스트의 마지막 인덱스를 의마한다. 리스트가 비어있을 경우 -1 인덱스를 지정하면 에러를 발생한다.
22.2 리스트의 할당과 복사 알아보기
다음과 같이 리스트를 만든 후 다른 변수에 할당하면 리스트는 두개가 아니라 다음과 같은 형태인 하나의 리스트가 있는것이다.
a 와 b를 is d연산자로 비교해보면 같은 True가 나온다. 변수 이름만 다를 뿐 같은 객체인 것이다.
두 변수 중 하나의 리스트에 적용되어도 같은 객체이기 때문에 두 변수 모두 반영된다.
a 와 b를 완전히 다른 두 객체로 만들려면 copy 메서드로 복사해야 한다. copy 메서드로 복사한 두 리스트는 is 연산자로 비교시 False로 나오며, == 연산자로 비교하면 요소가 모두 같기 때문에 True로 나온다. 둘 중 리스트 하나의 값을 변경해도 다른 리스트에 반영되지 않는다.
22.3 반복문으로 리스트의 요소를 모두 출력하기
22.3.1 for 반복문으로 요소 출력하기
for 반복문은 다음과 같이 in 뒤에 리스트를 지정하면 된다.
for i in a: 는 리스트 a 에서 순서대로 요소를 꺼내 i에 저장하는 것을 반복한다. in 뒤에 변수가 아닌 리스트를 직접 지정할 수도 있다.
22.3.2 인덱스와 요소를 함께 출력하기
for 반복문에서 요소를 출력할 때 인덱스도 함께 출력하려면 enumerate를 사용한다.
enumerate()에 리스트를 넣으면 인덱스와 요소를 동시에 꺼내올 수 있다.
다음과 같이 start를 지정하여 시작할 인덱스의 숫자를 지정할 수 있다.
enumerate(a, start=1)은 enumerate(a, 1)처럼 간소화 시켜 사용할 수 있다.
22.3.3 while 반복문으로 요소 출력하기
인덱스를 설정할때는 i < len(a)로 리스트 길이는 마지막 인덱스 보다 1 크기 때문에 더 작게 해야 한다. 만약 <= 연산자를 사용할 경우 리스트의 범위를 벗어나 에러를 출력하게 된다.
22.4 리스트의 가장 작은 수, 큰 수 구하기
다음에 나오는 방식들은 튜플에서도 사용 가능하다.
22.4.1 가장 작은 수와 가장 큰 수 구하기
반복문을 이용하여 리스트에서 가장 작은 수를 구하는 방법은 다음과 같다.
리스트의 첫 번째 요소를 변수(smallest)에 저장하고, for 반복문으로 리스트의 요소를 바꾸며 smallest보다 작으면 smallest에 i 를 할당한다.
가장 큰 수를 구하려면 다음과 같이 부등호를 반대로 바꾸면 된다.
리스트를 정렬하는 sort 메서드를 이용하여 구할 수도 있다. 오름차순으로 정렬하면 첫번째 요소가 가장 작은 숫자이고, 내림 차순으로 정렬하면 첫번째 요소가 가장 큰 숫자이다.
파이썬에서 제공하는 min, max 함수를 사용해서도 구할 수 있다.
min은 가장 작은 값을 구하고, max는 가장 큰 값을 구한다.
22.4.2 요소의 합계 구하기
리스트 요소의 전체 합계를 구할 때는 다음과 같이 반복문을 사용할 수 있다.
합계를 구하는 sum 함수도 제공한다.
min,max,sum은 리스트 뿐 아니라 모든 반복 가능한 객체들(튜플, 딕셔너리, range, 세트 등)에 사용할 수 있다.
22.5 리스트 표현식 사용하기
파이썬은 리스트 안에 for 반복문이나 if 조건문을 넣을 수 있다. 리스트 안에 식, for문, if문 등을 지정하여 리스트를 생성하는 것을 리스트 컴프리헨션(list comprehension)이라고 하며 여기서는 리스트 표현식이라 한다.
리스트 표현식은 다음과 같은 형태로 사용한다.
- [식 for 변수 in 리스트]
- list(식 for 변수 in 리스트]
range로 0 부터 9까지 i를 이용하여 꺼내고, i를 이용하여 리스트를 만드는 것이다.
다음과 같이 i를 다른 값과 연산하면 각 연산의 결과를 리스트로 생성한다.
22.5.1 리스트 표현식에서 if 조건문 사용하기
if 조건문은 다음과 같이 for 반복문 뒤에 지정한다.
- [식 for 변수 in 리스트 if 조건식]
- list(식 for 변수 in 리스트 if 조건식)
반복문 뒤에 if 조건문을 지정하면 숫자를 생성한 뒤 if 조건문에서 특정 숫자만 뽑아 내어 리스트를 생성한다. 위 코드의 경우에는 range로 생성한 0~9까지의 숫자들 중 짝수를 리스트에 넣었다.
if 조건문을 사용할 때도 i를 다른 값과 연산하여 리스트를 만들어도 된다.
22.5.2 for 반복문과 if 조건문 여러 번 사용하기
다음과 같이 for과 if를 여러 번 사용할 수 있다.
[식 for 변수1 in 리스트1 if 조건식1 for 변수2 in 리스트2 if 조건식2 ... for 변수n in 리스트n if 조건식n]
list(식 for 변수1 in 리스트1 if 조건식1 for 변수2 in 리스트2 if 조건식2 ... for 변수n in 리스트n if 조건식n)
다음은 2단부터 9단까지 구구단 리스트를 생성하는 코드이다.
다음과 같이 코드를 여러 줄로 입력하고, 들여쓰기를 하는 것도 가능하다. 들여쓰기는 안해도 되지만 가독성을 위해 하는 것이 좋다.
리스트에 for문이 여러개 일때는 뒤에서 부터 처리한다.
22.6 리스트에 map 사용하기
map은 리스트의 요소를 지정된 함수로 처리하는 함수이다. 이때 원본 리스트를 변경하지 않고 새 리스트를 생성한다. 튜플에도 사용 가능하다.
다음과 같이 실수가 담긴 모든 리스트를 정수로 변환하는 코드는 map을 이용하면 더 간결하고 편하게 작성할 수 있다.
리스트의 모든 요소를 int를 사용해서 정수로 변환하고, list함수를 이용해 다시 리스트를 만들어 준 것이다.
map은 리스트 뿐 아니라 모든 반복 가능한 객체를 넣을 수 있다. 다음 코드는 range로 생성된 정수들을 문자열로 변환한 것이다.
22.6.1 input().split()과 map
input().split()의 결과는 리스트 인것을 확인할 수 있다.
map을 사용하여 정수로 입력받으면 결과는 다음과 같다.
map로 입력받으면 map object로 저장된다. 안에 들어있는 값을 보기 위해서는 리스트 함수를 이용해 리스트로 만들어 줘야 한다.
이 리스트를 변수 두 개에 저장하면 지금까지 여러개의 변수를 입력 받을 때 저장했던 방식이다.
map 이 반환하는 맵 객체(map object)는 이터레이터 변수라서 변수 여러개에 저장하는 언패킹이 가능하다. 그래서 다음 코드 처럼 list()를 생략 한 것이다.
a, b = map(int, input().split())
이를 풀어서 쓰면 다음과 같다.
x = input().split() # 문자열 리스트
m = map(int, x) # 리스트의 요소를 정수로 형변환, 맵 객체
a, b = m # 맵 객체는 여러 변수에 저장 가능
22.7 튜플 응용하기
튜플은 리스트와 달리 내용을 변경할 수 없기 때문에 내용을 변경하는 메서드는 사용할 수 없고, 요소 정보를 구하는 메서드만 사용할 수 있다.
22.7.1 튜플에서 특정 값의 인덱스 구하기
index(값)을 활용하면 된다. 같은 값의 요소가 여러개일 경우 처음 찾은 값의 인덱스를 반환한다.
22.7.2 특정 값의 개수 구하기
count(값)으로 튜플에서 특정 값의 개수를 구할 수 있다.
a 리스트에는 2가 3개 들어 있기 때문데 3을 반환한다.
22.7.3 for 반복문으로 요소 출력하기
방법은 리스트와 동일하다.
22.7.4 튜플 표현식 사용하기
다음과 같은 방식으로 사용한다.
tuple(식 for 변수 in 리스트 if 조건식)
다음과 같이 괄호 안에 표현식을 넣으면 튜플이 아니라 제너레이터 표현식이 된다.
22.7.5 tuple에 map 사용하기
튜플에 map사용도 리스트와 동일하다.
위 코드는 튜플 자체를 변화시킨 것이 아니라 , 각 요소들을 int로 매핑시켜 새로운 튜플을 만들어 준 것이다.
이 과정을 코드로 작성하면 다음과 같을것 같다.
22.7.6 튜플에서 가장 작은 수, 가장 큰 수, 합계 구하기
min()으로 가장 작은 수를, max()로 가장 큰 수를, sum()으로 합계를 구할 수 있다.
22.8 퀴즈
정답은 a,d이다.
정답은 e이다.
정답은 a,d,e이다.
정답은 b이다. 튜플은 값의 변형이 불가능하다.
정답은 d 이다.
정답은 c이다.
22.9 연습문제 : 리스트에서 특정 요소만 뽑아내기
정답은 다음 코드와 같다.
[i for i in a if len(i) == 5]
리스트 표현식에 for문을 사용하여 리스트 요소들을 각각 가져와서 len()함수로 길이를 검사하고, 길이가 5이면 b리스트에 저장한다.
22.10 심사문제: 2의 거듭제곱 리스트 생성하기
정답은 다음 코드와 같다.
n1, n2 = map(int, input().split())
li = [2**i for i in range(n1, n2+1)]
del li[1]
del li[-2]
print(li)
리스트 li에 표현식을 첫번째 입력 값부터 두번째 입력 값(포함) 까지 2의 거듭제곱을 저장하였다. 두번째 요소와 뒤에서 두번째 요소는 del을 이용하여 1번 인덱스와 -2번 인덱스를 삭제하고 리스트를 출력하였다.
'Project H4C Study Group' 카테고리의 다른 글
[Project H4C] 파이썬 코딩도장(8) (0) | 2021.01.26 |
---|---|
[Project H4C] 파이썬 코딩도장(7) (0) | 2021.01.26 |
[Project H4C] 파이썬 코딩도장(5) (0) | 2021.01.23 |
[Project H4C] 파이썬 코딩도장(4) (0) | 2021.01.21 |
[Project H4C] 파이썬 코딩도장(3) (0) | 2021.01.20 |