22.09.07(수) Today I Learned

정형빈·2022년 9월 7일
0

TIL

목록 보기
7/71

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일차 파이썬 강의의 내용이다.

반복문

  • while 혹은 for문을 사용해 반복문을 사용할 수 있다.
  • for문
    • list, tuple, set 자료형의 요소들로 반복문을 사용할 수 있다.
    • enumerate()를 사용해 반복되는 요소가 몇번째인지 확인할 수 있다.
    • dictionary 자료형의 key 혹은 value로 반복문을 사용할 수 있다.
    • range() 함수를 활용하면 원하는 만큼 반복문을 사용할 수 있다.
    • continue를 활용해 특정 상황에서 아무런 동작도 하지 않고 넘어갈 수 있다.
    • break를 활용해 특정 상황에서 반복문을 중지시킬수 있다.
  • while문
    • 사용 방법은 for문과 크게 다르지 않지만, 조건을 다루는 방식에 차이가 있다.
    • 대부분의 경우 while문은 반복 할 횟수가 정해져 있지 않을 때 사용한다.

자주 사용되는 모듈 및 패턴

  • type() / 값의 자료형 확인해보기
  • split() / string을 list로 변환하기
  • join() / list를 string으로 변환하기
  • pprint() / 코드 예쁘게 출력하기
  • random / 랜덤한 로직이 필요할 때
  • time / 시간 다루기
  • datetime / 날짜 다루기

지금까지 배운 문법들을 활용해 로또 번호를 뽑는 코드 작성하기

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 파이썬 오늘의 과제

-숫자야구 게임 만들기

사용자의 입력을 받아 숫자야구 게임을 만들어주세요

요구조건

  • 프로그램이 시작되면 슷자야구 게임을 몇 자리 숫자로 할 건지 입력 받아 주세요
    • 3을 입력할 경우 해당 숫자야구 게임은 3자릿수로 진행, 최대 10자리
  • 첫 번째 입력을 받은 자릿수 만큼 후 파이썬으로 중복 없는 랜덤한 수를 생성해 주세요
  • 사용자가 숫자를 입력 했을 때 숫자야구 게임의 규칙에 맞게 ball / out count를 출력해 주세요
  • 사용자가 정답을 맞춘 경우 아래 항목들을 출력해 주세요
    • 사용자가 정답을 맞추기까지 입력 한 횟수
    • 사용자가 게임을 시작해서 정답을 맞추기까지 소요된 시간
    • 정답을 맞춘 시점의 날짜/시간
  • 게임을 진행하던 도중, “exit”을 입력할 경우 프로그램을 종료해 주세요

코드작성 시작!

  • 프로그램이 시작되면 슷자야구 게임을 몇 자리 숫자로 할 건지 입력 받아 주세요
    • 3을 입력할 경우 해당 숫자야구 게임은 3자릿수로 진행, 최대 10자리
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

를 첫줄에 추가한다.

  • 사용자가 숫자를 입력 했을 때 숫자야구 게임의 규칙에 맞게 ball / out count를 출력해 주세요

사용자가 입력한 숫자를 받기위해 먼저 코드를 작성하였다.

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에 들어간 숫자와 랜덤으로 지정된 숫자를 비교하여 점수계산을 해야 하는데 지금까지 작성한 부분만 해도 구글링을 통해 도움을 받아서 했는데도 사용된 코드를 이해하는데 굉장히 긴 시간이 걸려서 시간이 부족함을 느꼈다.

다행히도 튜터님이 먼저 이번 과제는 난이도가 어려우니 기간을 추석까지로 늘려주셨고 이 과제는 오늘 여기까지만 한다면 저녁에는 오늘의 알고리즘 실습을 진행할 시간을 얻을 수 있게되었다.

나머지 코드 작성은 남는 시간과 추석 연휴를 활용해서 작성해야 할 것 같다. 내 연휴를 돌려줘 ㅠㅠ

알고리즘 실습

오늘의 알고리즘 실습은 함수 단계이다.

15596번 정수 N개의 합

문제
정수 n개가 주어졌을 때, n개의 합을 구하는 함수를 작성하시오.

  • Python 2, Python 3, PyPy, PyPy3: def solve(a: list) -> int
    • a: 합을 구해야 하는 정수 n개가 저장되어 있는 리스트 (0 ≤ a[i] ≤ 1,000,000, 1 ≤ n ≤ 3,000,000)
    • 리턴값: a에 포함되어 있는 정수 n개의 합 (정수)

정답

def solve(a):
    return sum(a)

조건을 까다롭게 걸어뒀는데 정답은 굉장히 간단하게 나왔다. 매개변수를 a로 두고 파이썬 내장함수인 sum 함수를 통해 전달받은 리스트의 합을 반환하게 하면 끝이었다.

4673번 셀프 넘버

문제
셀프 넘버는 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의 원소로 있을 경우만 지우도록 조건문을 추가하였다.

1065번 한수

문제
어떤 양의 정수 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에 추가하도록 하겠다.

profile
스파르타 내일배움캠프 3기 수강생 정형빈

0개의 댓글