파이썬 checkio, House Password 풀이와 해설
파이썬 공부하기파이썬을 게임하듯 공부할 수 있는 checkio의 22번째 미션 House Password 입니다.
Elementary 섬의 모든 미션을 해결한 후 나오는 첫번째 미션이죠.
주어진 문자열이 암호의 조건에 맞으면 True, 틀리면 False를 리턴하는 미션입니다.
암호의 조건은 문자열의 길이가 10자 이상이고, 적어도 하나의 숫자, 대문자, 소문자를 포함하고 모두 ASCII 문자여야 합니다.
checkio('A1213pokl') == False # 이 문자열은 길이가 10자 미만이라 False입니다.
checkio('bAse730onE') == True # 이 문자열은 암호 조건에 부합하므로 True입니다.
checkio('asasasasasasasaas') == False # 모두 소문자이므로 False
checkio('QWERTYqwerty') == False # 모두 대문자이므로 False
checkio('123456123456') == False # 모두 숫자이므로 False
checkio('QwErTy911poqqqq') == True # 암호 조건에 부합하므로 True 입니다.
제가 푼 해답의 소스를 하나씩 설명하면
def checkio(data: str) -> bool:
#replace this for solution
# 문자열 data의 길이를 내장함수 len을 써서 확인합니다.
# len(data) < 10 즉, 문자열의 길이가 10 미만이면, 바로 False를 리턴합니다.
if len(data) < 10:
return False
# data.isdigit()는 문자열이 모두 숫자로 구성되었는지 확인하는 부분입니다.
# data가 "1234567890123"과 같이 길이는 10을 넘지만 모두 숫자로 구성되어 있기 때문에
# 암호의 조건에 맞지 않습니다.
# data.isdigit() 가 True 즉, 모두 숫자로 구성된 문자열이면 False를 리턴합니다.
if data.isdigit() :
return False
# if data.isupper == data:
# 이 부분은 data를 모두 대문자(upper)로 변환한 결과가 처음 data와 같다면
# 그렇다는 말은 data가 처음부터 모두 대문자란 말이죠. 이 경우엔 data에 소문자가 없으므로 False를 리턴
if data.isupper == data :
return False
# if data.islower == data:
# 이 부분은 data를 모두 소문자(lower)로 변환한 결과가 처음 data와 같다면
# 그렇다는 말은 data가 처음부터 모두 소문자란 말이죠. 이 경우엔 data에 대문자가 없으므로 False를 리턴
if data.islower == data :
return False
# 이제.. 위 소스에서 네가지 조건이 걸러졌습니다.
# 문자열의 길이가 10미만이거나, 문자열이 모두 숫자이거나 모두 대문자이거나 모두 소문자인 것은
# return False 되었습니다.
# 이제 남은 문자열 data에 적어도 숫자 하나가 있는가?만 검사하면 됩니다.
# any 함수는 ()안에 들어간 인자 중에서 하나라도 True이면 True를 리턴합니다.
# c.isdigit() for c in data
# data에서 문자를 하나씩 꺼내어 c에 넣고, 이것은 isdigit()로 검사하여 숫자인가를 확인합니다.
# data 중에서 하나라도 숫자가 있으면 True가 나오므로 결국 True를 리턴합니다.
return any(c.isdigit() for c in data)
처음 이 문제를 풀 때, data.isdigit() 부분을 빼고 왜 안되나 한참 고민했었네요.
모두 숫자일 때도 체크해야 합니다.