[250207] 사전캠프 16일차 Python + SQL

이효원·2025년 2월 7일

Python

Python 응용 Lv3. 단어 맞추기 게임

  1. 컴퓨터가 랜덤으로 영어단어를 선택합니다.
    • 영어단어의 자리수를 알려줍니다.
  2. 사용자는 A 부터 Z 까지의 알파벳 중에서 하나를 선택합니다.
    • 맞출 경우 해당 알파벳이 들어간 자리를 전부 보여줍니다.
    • 틀릴 경우 목숨이 하나 줄어듭니다.
  3. 사용자가 9번 틀리면 게임오버됩니다.
  4. 게임오버 되기 전에 영어단어의 모든 자리를 알아내면 플레이어의 승리입니다.
# random 모듈 사용
import random
# 단어 사전 입력
words = [
    "airplane",
    "apple",
    "arm",
    "bakery",
    "banana",
    "bank",
    "bean",
    "belt",
    "bicycle",
    "biography",
    "blackboard",
    "boat",
    "bowl",
    "broccoli",
    "bus",
    "car",
    "carrot",
    "chair",
    "cherry",
    "cinema",
    "class",
    "classroom",
    "cloud",
    "coat",
    "cucumber",
    "desk",
    "dictionary",
    "dress",
    "ear",
    "eye",
    "fog",
    "foot",
    "fork",
    "fruits",
    "hail",
    "hand",
    "head",
    "helicopter",
    "hospital",
    "ice",
    "jacket",
    "kettle",
    "knife",
    "leg",
    "lettuce",
    "library",
    "magazine",
    "mango",
    "melon",
    "motorcycle",
    "mouth",
    "newspaper",
    "nose",
    "notebook",
    "novel",
    "onion",
    "orange",
    "peach",
    "pharmacy",
    "pineapple",
    "plate",
    "pot",
    "potato",
    "rain",
    "shirt",
    "shoe",
    "shop",
    "sink",
    "skateboard",
    "ski",
    "skirt",
    "sky",
    "snow",
    "sock",
    "spinach",
    "spoon",
    "stationary",
    "stomach",
    "strawberry",
    "student",
    "sun",
    "supermarket",
    "sweater",
    "teacher",
    "thunderstorm",
    "tomato",
    "trousers",
    "truck",
    "vegetables",
    "vehicles",
    "watermelon",
    "wind"
]
# 랜덤 단어 선택
random_word = random.choice(words)
# 단어의 자리수 
word_lengh = (len(random_word))
# 단어의 자리수 공개
print(f'정답 단어의 자리 수는 {word_lengh}입니다.')

# 시도 횟수 9번
hp = 9
# 게임의 결과 = 빈칸이 정답의 자리 수 만큼 있는 리스트 생성
game_result = ['_']*word_lengh
# 반복문 조건, hp가 > 0 일 때:
while hp > 0:
	# 원하는 알파벳 입력
    alphabet = str(input('알파벳을 입력하세요: '))
    # 알파벳이 정답에 포함될 경우
    if alphabet in random_word:
        for i in range(word_lengh):
        	# 만약 입력한 알파벳이 단어의 특정 자리 수에 일치할 경우
            if alphabet == random_word[i]:
            	# 게임 결과 업데이트. 게임 결과의 자리수에 그 알파벳이 오도록
                game_result[i] = alphabet
        # 그리고 리스트를 문자열로 바꾸어 공개
        print(''.join(game_result))
    # 알파벳이 정답이 아닐경우
    else:
    	# hp 1 감소
        hp -= 1
        print(f'남은 목숨 {hp}')
    # 모든 알파벳을 다 찾았을 경우 break로 반복 종료 
    if ''.join(game_result) == random_word:
        print('축하합니다!')
        break
# while문이 조건을 성립하지 못해 끝났을 경우 (조건이 거짓일 때)
else:
	# 게임오버
    print('게임오버.')
# 최종 정답 공개
print(f'정답: {random_word}')

한 문제 푸는데 세시간 걸렸다.
단어의 자리 수 공개까지는 금방하고 아래 게임에서 막힘...
gpt없었으면 오늘안에 못 풀 것 같아서 도움받음.

스스로 생각한 부분 : hp = 9 만들고 while문 조건을 hp>0으로 해서 틀릴때마다 1씩 빼기.

ai 힌트 받은 부분 :
1) game_result 를 리스트로 만든다는 개념
리스트로 만들어서 입력한 알파벳이 있으면 자리 수 공개하는 함수까지 만들었는데, 결국 game_result가 그때그때 입력한 값에만 움직이고, 누적이 안됐음

def game(alphabet, word):
    result = []
    for i in word:
        if i == alphabet:
            result.append(alphabet)
        else:
            result.append('_')
    return result

2) game_result를 빈칸글자수로 만들고 업데이트하기
실행할 때마다 글자수가 그때 그때 달라지기 때문에 반영하기 위해 빈칸
글자수로 미리 결과를 만들어놓고, 그때그때 정답이면 채워서 업데이트하는 방식

추가 ai 피드백

# 대소문자 구분 없이 입력 받는 법
 alphabet = input('알파벳을 입력하세요: ').lower()  
	
    # 입력된 알파벳이 하나가 아니면 다시 입력 받음
    if len(alphabet) != 1 or not alphabet.isalpha():
        print("알파벳 하나만 입력해주세요.")
        continue

SQL

SQL 실전 Lv1. 데이터 속 김서방 찾기

users 테이블에서 김씨 이름 가진 사람 찾기

# 내 풀이
SELECT
	COUNT(*) name_cnt
FROM users
# like 활용 : 김씨성 찾기
WHERE name LIKE '김%';
# 답안
SELECT count(distinct(user_id)) as name_cnt
FROM 
    users
    # substring 활용 : '김' 이란 글자 찾기
WHERE substr(name,1,1) = '김'

조건은 동일한데 user_id distinct 안 치면 같은 사람이 여러번 주문했을 경우 중복포함 가능. 다행히 중복이 없어서 답은 일치했지만 주의하자

SQL 실전 Lv2. 날짜별 획득포인트 조회하기

날짜별로 획득한 포인트가 점점 늘어나는지 줄어드는지 확인

  • 문제: 다음과 같은 결과테이블을 만들어봅시다.
    • created_at: 익명화된 유저들의 아이디(varchar255)
    • average_points: 유저가 획득한 날짜별 평균 포인트(int), 반올림 필수
SELECT 
	  DATE(created_at) created_at
      # ROUND로 반올림!
	, ROUND(AVG(point)) average_points
FROM point_users
GROUP BY 1

느낀점

파이썬 응용문제 쉽지 않았지만 재밌었다.! 벌써 사전캠프가 1주일 남았다. 다음주엔 월, 화에 SQL 문제 다 풀고, 북 스터디를 통해서 본캠프를 잘 준비해야겠다.

0개의 댓글