TIL

2024.11.21

죵욜이 2024. 11. 21. 15:56

오늘 퀘스트풀이중 처음으로 30분이상 고민한 문제가있었다.

바로 이문제 인데 이전까지 퀘스트는 힌트로 가이드라인이 주어졌지만
이번힌트는 

요런식으로 단어들 리스트만 던져주고 끝이었다.

 

처음에 멘붕이왔지만 천천히 문제를 읽어보니 어라? 풀만한데? 라는 생각이 들었다.

그래서 오늘은 이 풀이과정을 정리해보려고 한다.


먼저 저 단어들에서 랜덤으로 뽑아와야하니 리스트를 그대로 복사해서 박아넣었다.

word_list = [
    "어쩌구 저쩌구"
]

 

그후 랜덤하게 뽑아와야하는데 저번에 공부한 random()함수를 사용하기로 했다.

그전에 random() 함수를 사용하려면 random 라이브러리를 import 해야하기때문에 제일 윗줄에 추가하였다.

import random
word_list = [어쩌구 저쩌구]

answer_word = random.choice(word_list)

 

 

그리고 문제를 보면 단어의 자릿수를 알려주니

import random
word_list = [어쩌구 저쩌구]

answer_word = random.choice(word_list)
print(f"영어단어는 {len(answer_word)}자리 입니다")     # 추가

를 추가하고 이제부터 고민의 시간이 찾아왔다.

 

사용자가 알파벳을 선택하고 맞으면 그자리를 알려주고 틀리면 기회9번중에 한번이 날라간다. 

그래서 일단 input() 으로 받고 유효성검사를 진행하려했다.

import random
word_list = [어쩌구 저쩌구]

answer_word = random.choice(word_list)
print(f"영어단어는 {len(answer_word)}자리 입니다") 

# 추가
user_choice = input("A 부터 Z 까지의 알파벳 중에서 하나를 선택하세요")

if len(user_choice) == 1 and user_choice.isalpha():
    ~~~~
else :
    print("잘못된 입력입니다.")

 

사용자가 선택한 글자가 알파벳이 맞는지? 여러글자가아닌 한글자만 입력했는지 판단하기위한 코드였다.

이때 알파벳이 맞는지 판단하기위해 isalpha() 함수를 사용하였는데 

 

isalpha()

  • 말그대로 알파벳인지 확인
  • 문자열 메소드라서 str.isalpha() 이런식으로 사용
  • 결과값으로 boolean값을 반환 -> True, False 
  • 유니코드로 정의된 모든 알파벳 문자를 기준으로 판단 -> A  - Z, a - z

간단하게 정리하면 이런식이다.

 

그후 선택한 단어가 정답안에 들어있는지 판별하기위해  위에있는 if 문 에있는 ~~~ 부분에 조건을 걸어줘야한다.

import random
word_list = [어쩌구 저쩌구]

answer_word = random.choice(word_list)
print(f"영어단어는 {len(answer_word)}자리 입니다") 
chance = 0     # 추가
user_choice = input("A 부터 Z 까지의 알파벳 중에서 하나를 선택하세요")

if len(user_choice) == 1 and user_choice.isalpha():
    #################추가된부분#################
    user_choice = user_choice.lower()
    
    if user_choice in answer_word:
        for i in range(len(answer_word)):
            if user_choice == list(answer_word)[i]:
        print("맞혔습니다!")
    else :
        chance += 1
        print(f"{chance}번 틀렸습니다.")
    ############################################
else :
    print("잘못된 입력입니다.")

미리 박아둔 단어리스트가 다 소문자기때문에 사용자가 대문자로 입력할수도있으니

.lower() 를 통해 다 lowercase 로 변경해주었다. 

그후 정답을 맞히면 그 부분을 알려주고 다음 단어를 받아야하니 기회가남아있는한, 다맞추지 못하는한 반복하게 while문안에 저 코드들을 집어넣으려고 했다.

import random
word_list = [어쩌구 저쩌구]

answer_word = random.choice(word_list)
print(f"영어단어는 {len(answer_word)}자리 입니다") 
chance = 0
answer_list = [' '] * len(answer_word)     # 추가

while chance < 9 and ' ' in answer_list:     # 추가
	print(f"현재상태 : {answer_list}")     # 추가
    user_choice = input("A 부터 Z 까지의 알파벳 중에서 하나를 선택하세요")

    if len(user_choice) == 1 and user_choice.isalpha():
        user_choice = user_choice.lower()

        if user_choice in answer_word:
            for i in range(len(answer_word)):
                if user_choice == list(answer_word)[i]:
                    answer_list[i] = user_choice     # 추가
            print("맞혔습니다!")
        else :
            chance += 1
            print(f"{chance}번 틀렸습니다.")
    else :
        print("잘못된 입력입니다.")

그리고 게임종료조건과 게임승리조건을 while 문안에 추가해줘서 루프를 빠져나오게 해준다

import random
word_list = [어쩌구 저쩌구]

answer_word = random.choice(word_list)
print(f"영어단어는 {len(answer_word)}자리 입니다") 
chance = 0
answer_list = [' '] * len(answer_word)     # 추가

while chance < 9 and ' ' in answer_list:     # 추가
	print(f"현재상태 : {answer_list}")     # 추가
    user_choice = input("A 부터 Z 까지의 알파벳 중에서 하나를 선택하세요")

    if len(user_choice) == 1 and user_choice.isalpha():
        user_choice = user_choice.lower()

        if user_choice in answer_word:
            for i in range(len(answer_word)):
                if user_choice == list(answer_word)[i]:
                    answer_list[i] = user_choice     # 추가
            print("맞혔습니다!")
        else :
            chance += 1
            print(f"{chance}번 틀렸습니다.")
    else :
        print("잘못된 입력입니다.")
    
    #######################추가#####################
    if chance >= 9:
        print("기회가 끝났습니다. 게임오버!")
        
    if ' ' not in answer_list :
    	print("축하합니다! 플레이어 승리!")
    ######################추가#########################

 

 

그러나 여기서문제가 발생했다.

테스트를 하기위해 주피터노트북으로 돌려보았는데 

이런식으로 잘나오는데 

연속된 알파벳 ex) ab 가 들어간경우, 숫자가 들어간경우 등등 다 걸러지게 되었다. 그러나 한글을 입력하게되는 경우,

이렇게 틀렸다고 나오게되는것이다. 예상되는 예외처리를 해놔서 

"잘못된 입력입니다." 가 나와야하는데 한글 '가' 가 입력되어도 isalpha() 가 True 값으로 넘겨 if문을 통해 틀렸다는 결과가 나온것이었다.

 

왜그런지 알아보니 isalpha() 함수에 문제가있는데

 

아까 위에서보았듯이 이함수는 유니코드 문자집합을 기준으로 판단을 내려 숫자, 공백, 특수문자 등은 False 를 반환하지만 알파벳 문자만 판단하는것이 아닌, 모든 언어의 문자에도 적용을 해 True 로 반환하게된다.

 

한글, 한자, 일본어 등등이 다 isalpha() 를 타면 True 로 나온다는것이다.

 

그래서 isalpha() 를 사용하지않고 그냥 in ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz") 이걸로 급하게 바꾸고 다른좋은 방법이 없는지 좀더 찾아보려고 한다.

'TIL' 카테고리의 다른 글

[WIL] 본캠프 2주차  (16) 2024.12.09
[WIL] 본캠프 1주차  (2) 2024.11.30
2024.11.14  (3) 2024.11.15
2024.11.13  (1) 2024.11.14
2024.11.10  (4) 2024.11.10