9/7 오늘의 시간표
09:00 ~ 10:00 [실시간] 파이썬 문법
10:00 ~ 11:00 [실시간] 파이썬 문법
11:00 ~ 12:00 [실시간] 파이썬 문법
12:00 ~ 13:00 [실시간] 파이썬 문법
13:00 ~ 14:00 점심식사
14:00 ~ 15:00 [실시간] 파이썬 문법
15:00 ~ 16:00 [실시간] 파이썬 문법
16:00 ~ 17:00 [실시간] 파이썬 문법
17:00 ~ 18:00 [실시간] 파이썬 문법
18:00 ~ 19:00 저녁식사
19:00 ~ 20:00 [실습] 실무적용 알고리즘 실습
20:00 ~ 21:00 [실습] 실무적용 알고리즘 실습
어제와 차이없는 이제는 익숙해져버린 시간표이다.
파이썬 실시간 강의
3일차 파이썬 강의의 내용이다.
import random
lotto = set() # lotto 변수를 set 자료형으로 선언
def get_lotto_number(count):
result = []
if count < 1:
print("1 이상의 값을 입력해주세요")
for _ in range(count): # count만큼 반복해서 실행
lotto = set()
while len(lotto) < 8: # lotto의 요소 갯수가 8 이하일 경우 계속해서 반복
lotto.add(random.randint(1, 45)) # lotto에 1~45 사이의 랜덤 값을 입력
result.append(lotto)
return result
lotto_numbers = get_lotto_number(10)
print(lotto_numbers)
# result print
"""
[
{1, 3, 4, 6, 9, 44, 18, 22, 26},
{2, 5, 9, 11, 44, 45, 19, 23, 28},
{1, 4, 39, 41, 16, 18, 27, 29, 31},
{2, 5, 8, 9, 14, 20, 22, 24, 31},
{33, 37, 6, 40, 41, 42, 19, 30, 31},
{33, 1, 36, 8, 41, 9, 17, 24, 30},
{5, 39, 41, 10, 12, 16, 23, 25, 26},
{3, 35, 37, 11, 14, 17, 19, 20, 30},
{33, 35, 3, 11, 43, 15, 16, 27, 30},
{33, 36, 38, 6, 43, 24, 25, 30, 31}
]
"""
# 랜덤 값을 사용하기 때문에 코드를 실행할 때마다 결과는 달라진다.
9/7 파이썬 오늘의 과제
-숫자야구 게임 만들기
print('숫자야구 게임을 몇 자리 숫자로 하시겠습니까?(최대 10자리까지 선택 가능합니다.)')
N = int(input())
if 0 < N <= 10:
print(f'{N}자리로 게임을 시작합니다.')
else:
print('최대 10자리까지만 선택이 가능합니다.')
def get_numbers():
numbers = []
while len(numbers) < N:
num = randint(0, 9)
if num not in numbers:
numbers.append(num)
print(f'{N}자리의 숫자가 선정되었습니다.')
return numbers
파이썬의 랜덤 함수 중 임의의 정수를 가져오는 randint 함수를 import 하기 위해
from random import randint
를 첫줄에 추가한다.
사용자가 입력한 숫자를 받기위해 먼저 코드를 작성하였다.
def take_guess():
print('숫자 3개를 차례대로 입력하세요.')
new_guess = []
while len(new_guess) < N:
new_num = int(input("{}번째 숫자를 입력하세요:".format(len(new_guess) + 1)))
if new_num < 0 or new_num > 9:
print('범위를 벗어나는 숫자입니다. 다시 입력하세요.')
elif new_num in new_guess:
print('중복되는 숫자입니다. 다시 입력하세요.')
else:
new_guess.append(new_num)
return new_guess
숫자는 0~9 까지만 고를 수 있고 중복된 숫자는 고를 수 없기 때문에 조건문을 걸어두고 해당 조건에 어긋나지 않는 경우에만 list에 들어가도록 한다.
이제 list에 들어간 숫자와 랜덤으로 지정된 숫자를 비교하여 점수계산을 해야 하는데 지금까지 작성한 부분만 해도 구글링을 통해 도움을 받아서 했는데도 사용된 코드를 이해하는데 굉장히 긴 시간이 걸려서 시간이 부족함을 느꼈다.
다행히도 튜터님이 먼저 이번 과제는 난이도가 어려우니 기간을 추석까지로 늘려주셨고 이 과제는 오늘 여기까지만 한다면 저녁에는 오늘의 알고리즘 실습을 진행할 시간을 얻을 수 있게되었다.
나머지 코드 작성은 남는 시간과 추석 연휴를 활용해서 작성해야 할 것 같다. 내 연휴를 돌려줘 ㅠㅠ
알고리즘 실습
오늘의 알고리즘 실습은 함수 단계이다.
문제
정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.
정답
def solve(a):
return sum(a)
조건을 까다롭게 걸어뒀는데 정답은 굉장히 간단하게 나왔다. 매개변수를 a로 두고 파이썬 내장함수인 sum 함수를 통해 전달받은 리스트의 합을 반환하게 하면 끝이었다.
문제
셀프 넘버는 1949년 인도 수학자 D.R. Kaprekar가 이름 붙였다. 양의 정수 n에 대해서 d(n)을 n과 n의 각 자리수를 더하는 함수라고 정의하자. 예를 들어, d(75) = 75+7+5 = 87이다.
양의 정수 n이 주어졌을 때, 이 수를 시작해서 n, d(n), d(d(n)), d(d(d(n))), ...과 같은 무한 수열을 만들 수 있다.
예를 들어, 33으로 시작한다면 다음 수는 33 + 3 + 3 = 39이고, 그 다음 수는 39 + 3 + 9 = 51, 다음 수는 51 + 5 + 1 = 57이다. 이런식으로 다음과 같은 수열을 만들 수 있다.
33, 39, 51, 57, 69, 84, 96, 111, 114, 120, 123, 129, 141, ...
n을 d(n)의 생성자라고 한다. 위의 수열에서 33은 39의 생성자이고, 39는 51의 생성자, 51은 57의 생성자이다. 생성자가 한 개보다 많은 경우도 있다. 예를 들어, 101은 생성자가 2개(91과 100) 있다.
생성자가 없는 숫자를 셀프 넘버라고 한다. 100보다 작은 셀프 넘버는 총 13개가 있다. 1, 3, 5, 7, 9, 20, 31, 42, 53, 64, 75, 86, 97
10000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 출력하는 프로그램을 작성하시오.
입력
입력은 없다.
출력
10,000보다 작거나 같은 셀프 넘버를 한 줄에 하나씩 증가하는 순서로 출력한다.
정답
def funtion(n):
num = list(str(n))
for i in range(len(num)):
n += int(num[i])
return n
Set = list(range(1,10001))
for n in range(1,10001):
if funtion(n) in Set:
Set.remove(funtion(n))
for i in range(len(Set)):
print(Set[i])
먼저 n을 입력값으로 받아 n과 n의 각 자리수를 더한 수를 도출하는 함수 funtion을 구현하였다.
1부터 10000까지의 숫자 중 함수 funtion의 출력값으로 나오는 숫자를 지우고, 마지막에 남는 숫자들을 셀프 넘버라고 부를 수 있을 것이다.
1부터 10001까지의 정수가 있는 Set이란 리스트를 생성하여 1부터 10001의 정수에 대한 반복문을 사용하여 funtion(n)을 SET에서 하나씩 지워나갔다. 이때 funtion(n)을 이미 Set에서 지운 상태에서 또 remove를 시도하면 에러가 나므로 funtion(n)이 Set의 원소로 있을 경우만 지우도록 조건문을 추가하였다.
문제
어떤 양의 정수 X의 각 자리가 등차수열을 이룬다면, 그 수를 한수라고 한다. 등차수열은 연속된 두 개의 수의 차이가 일정한 수열을 말한다. N이 주어졌을 때, 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에 1,000보다 작거나 같은 자연수 N이 주어진다.
출력
첫째 줄에 1보다 크거나 같고, N보다 작거나 같은 한수의 개수를 출력한다.
정답
def funtion(N) :
a = 0
for i in range(1, N+1):
N_list = list(map(int,str(i)))
if i < 100:
a += 1
elif N_list[0]-N_list[1] == N_list[1]-N_list[2]:
a += 1
return a
N = int(input())
print(funtion(N))
1부터 N까지의 숫자의 각 자리 숫자가 등차수열을 이루는 수가 몇개인지 출력해야한다. 이때의 등차수열을 구하는 함수 funtion을 만들어야 했다. 1부터 N까지의 범위를 range 함수로 잡아주고 for문의 변수 i를 str함수로 문자열 변환 후 각 자릿수를 분리해서 다시 int를 사용해 정수로 변환시켰다. 1부터 99까지의 숫자는 모두 한수이다. 100이상인 숫자는 3자리 숫자를 앞의 두 자리의 차이와 뒤의 두 자리가 같으면 한수이다. 이것을 if 조건문으로 옮기면
if i < 100:
a += 1
elif N_list[0]-N_list[1] == N_list[1]-N_list[2]:
a += 1
가 된다. a를 리턴값으로 하고 자연수 N을 입력한 뒤 funtion함수를 실행시키면 원하는 답을 구할 수 있다.
오늘의 알고리즘 실습은 어제와 그저께에 비해 비교적 쉬웠고 문제 수도 적어서 금방 끝이 났다. 하지만 나에게는 저번에 풀지 못한 알고리즘 실습 문제들과 오늘 튜터님이 내주신 과제가 있기 때문에 남은 시간동안은 이것들을 최대한 해결하고 해결한 문제들은 이번주 WIL에 추가하도록 하겠다.