본문 바로가기
프로그램/Python 1000제

Python 100제] 어파처! p209 응용문제

by 건티 2022. 10. 7.
728x90

출처 : 반크_세계유산 경복궁

 

문제]

조건에 맞는 패스워드를 입력하는 프로그램을 작성하시오.

조건)

▶ 패스워드는 8자이상 20자 이하의 문자열로 작성하도록 한다.

▶ 패스워드를 작성할 때 대문자, 소문자, 숫자, 특수문자가 꼭 들어가도록 한다.

▶ 특수문자는 ~, !, #, $, &, _ 만 사용할 수 있다.

문자열 체크는 함수를 사용하시오.

▶ 패스워드에 조건에 맞는 문자가 없을 때는 해당 문자가 없다고 메세지를 출력하고 다시 입력하도록 한다.

조건에 맞는 패스워드면 사용가능한 패스워드라고 출력하고 프로그램을 종료하시오.

▶ 그외 출력 예를 참조하여 프로그램을 완성하시오.

 

출력 예)

PassWord를 입력하시오 : Ab1!

PassWord의 길이가 8~20자를 벗어납니다.

다시 입력하세요.

 

PassWord를 입력하시오 : ABCDEFGH

소문자, 숫자, 특수문자가 없습니다.

다시 입력하세요.

 

PassWord를 입력하시오 : AbCdEfGh

숫자, 특수문자가 없습니다.

다시 입력하세요.

 

PassWord를 입력하시오 : AbCdEfGh12

특수문자가 없습니다.

다시 입력하세요.

 

PassWord를 입력하시오 : AbCdEfGh12@

사용할 수 없는 특수문자를 입력하였습니다.

다시 입력하세요.

 

PassWord를 입력하시오 : abcdefgh

대문자, 숫자, 특수문자가 없습니다.

다시 입력하세요.

 

PassWord를 입력하시오 : a1#bcdef

대문자가 없습니다.

다시 입력하세요.

 

PassWord를 입력하시오 : Ab!12345

사용 가능한  PassWord입니다.

 

 

참고풀이]

#특수문자 체크함수
def Special(password):
    speAll="`~!@#$%^&*()_="
    spestr="~!#$&_"
     
    chk1=chk2=False
    for d in password:
        #특수문자가 있는 지 체크한다.
        for ca in speAll:
            if d==ca:
                chk1=True
                #특수문자가 있다면 
                #조건의 특수문자가 있는 지 체크한다.
                chk2=False
                for c in spestr:
                    if d==c:
                        chk2=True
        
    return chk1, chk2;

#소문자 체크함수
def Lower(password):
    lowstr="abcdefghijklmnopqrstuvwxyz"

    #소문자가 있는 지 체크한다.
    chk=False
    for d in password:
        for c in lowstr:
            if d==c:
                chk=True
                break
        if chk: break
    return chk;

#대문자 체크함수
def Upper(password):
    upstr="ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    #대문자가 있는 지 체크한다.
    chk=False
    for d in password:
        for c in upstr:
            if d==c:
                chk=True
                break
        if chk: break
    return chk;

#숫자 체크함수
def Number(password):
    numstr="0123456789"

    #숫자가 있는 지 체크한다.
    chk=False
    for d in password:
        for c in numstr:
            if d==c:
                chk=True
                break
        if chk: break
    return chk;

 

#통합체크 함수
def Check(password):
    Totstr=""
    Tchk=False
    S1str="대문자"
    S2str="소문자"
    S3str="숫자"
    S4str="특수문자"
    Count=0 #False의 개수를 센는 변수

    #체크 결과를 받는다.
    S1=Upper(password)
    S2=Lower(password)
    S3=Number(password)
    S4, S5=Special(password)
    
    #False의 개수를 센다.
    if not S1: Count+=1
    if not S2: Count+=1
    if not S3: Count+=1
    if not S4: Count+=1

    #조건이 전부 참일경우(대문자, 소문자, 숫자, 특수문자)
    if Count==0:
        if S5:
            Tchk=True
            Totstr="사용 가능한 PassWord입니다."
        else:
            Tchk=False
            Totstr="사용 할 수 없는 특수문자를 입력하였습니다."
    else:
        if Count>1:
            #대문자가 없을경우
            if not S1:
                Totstr += S1str + ", "
            #소문자가 없을 경우
            if not S2:
                Totstr += S2str + ", "
            #숫자가 없을 경우
            if not S3:
                Totstr += S3str + ", "
            #특수문자가 없을 경우
            if not S4:
                Totstr += S4str
        else:
            #대문자만 없을경우
            if not S1:
                Totstr += S1str
            #소문자만 없을 경우
            if not S2:
                Totstr += S2str
            #숫자만 없을 경우
            if not S3:
                Totstr += S3str
            #특수문자만 없을 경우
            if not S4:
                Totstr += S4str
            
        Totstr += "가 없습니다."
    
    return Tchk, Totstr
    
#Main 부분
while True:
    #패스워드를 입력한다.
    password=input("PassWord를 입력하시오 : ")

    if 8<= len(password) <=20:
        chk, CheckStr=Check(password)
        print(CheckStr)
        if chk: break
    else:
        print("PassWord의 길이가 8~20자를 벗어납니다.")

    print("다시 입력하세요.\n")
    #password를 재발행하기 위하여 password를 초기한다.
    password=""
        

 

 

참고풀이 결과]

 

 

 

 

 

대한민국의 아름다운 영토, 독도의 여름

 

 

반응형

댓글