분당아재의 솔직한 블로그

파이썬을 게임하듯 공부할 수 있는 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() 부분을 빼고 왜 안되나 한참 고민했었네요.

모두 숫자일 때도 체크해야 합니다. 


    


Comment +2

  • isuppr() 와 islower() 는 참 거짓을 반환하는 함수이므로 전달받은 data 와의 비교가 불가능합니다.
    때문에 isupper() --> upper()
    islower() --> lower()
    함수로 각각 대체해야 합니다.