본문 바로가기

Python 배우기

[외계어 배우기] 연습문제

"Chapter3 반복문: 한정 루프"에서 첫 번째 문제(문제#5)를 해결한 후 풀어보라고 제안한 문제 2가지 중 한 가지를 풀어보고 넘어가겠다.

 

문제는 사이트에서 확인할 수 있으며 2017년 Woburn Challenge의 주니어 부문 3라운드 문제라고 한다.

 

WC '17 Contest 3 J3 - Uncrackable - DMOJ: Modern Online Judge

You'd like to register an account on an extremely entertaining website. You've already selected a username, but it seems that the requirements for choosing a password are quite strict, in order to completely protect your account from being hacked into. The

dmoj.ca

 

우선, 문제를 훑어보자.

 

웹사이트에 등록하기 위해서 비밀번호를 설정하는 문제이다. 비밀번호는 8~12 사이의 길이를 가진 문자열로 구성되어 있고 이 문자열은 알파벳과 숫자로 이루어져 있다. 알파벳은 대문자와 소문자 모두 가능하고 숫자는 0 ~ 9 사이의 정수이다. 비밀번호는 적어도 3개의 소문자와 적어도 2개의 대문자, 그리고 적어도 1개의 숫자로 이루어져야 한다(공백 없음).

 

입력은 비밀번호, 즉 한 줄의 문자열이다. 출력도 한 줄인데, 만약 비밀번호가 설정 규칙에 맞으면 Valid, 틀리면 Invalid라고 표기한다.

 

자, 그럼 문제를 풀어보자.

 

파이참에서 내가 작성한 코드를 가지고, 첫 줄부터 순서대로 읽어보자.

1. 비밀번호(password)를 입력한다.

2. 문제를 읽어보면 알파벳과 숫자 외에 다른 문자에 대해서는 언급이 없었기 때문에 주석으로 넣어줬다. (다만 이걸 주석으로 넣어주는 것이 맞는지 모르겠다. 어쩌면 코드로 모두 작성해야 하는 것이 아닐까 싶었지만......)

4~6. 소문자(lowercase_letter), 대문자(uppercase_letter), 숫자(digit_letter)는 모두 0으로 초기값을 설정한다.

8. 만약에 password의 길이(len)가 8보다 크거나 같고 12보다 작거나 같다면,

    9. password에서 반복해서 char를 참조하는 상태에서,

        10. 만약 문자가 lowercse_letter라면,

            11. lowercase_letterlowercase_letter에 1을 더한 값이다. 즉, 소문자가 하나 발견되었다는 의미이다.

        12. 또 만약 문자가 uppercase_letter라면, 

            13. uppercase_letteruppercase_letter에 1을 더한 값이다. 즉, 대문자가 하나 발견되었다는 의미이다.

        14. 또 만약 문자가 digit_letter라면,

            15. digit_letterdigit_letter에 1을 더한 값이다. 즉 숫자가 하나 발견되었다는 의미이다.

    16. 만약 lowercase_letter가 3보다 크거나 같고(>= 3), uppercase_letter가 2보다 크거나 같고(>= 2), digit_letter가 1보다 크거나 같다(>= 1)면,

        17. Vlalid라고 출력하라.

    18. 만약 lowercase_letter.........

 

여기까지 작성한 걸 보다가 다시 문제를 보니, 문제에서 공백은 없어야 한다고 했지만 다른 문자, 즉 특수문자 등에 대한 언급은 없었다. 그런데 왜 나는 엉뚱하게도 주석까지 달고 18번과 19번을 추가했을까? (이런 걸 삽질이라고 하는구나!!!!!!)

덧, 여하튼 18번과 19번 그리고 2의 주석은 삭제한다.

 

다시 코드로 돌아가서

    20. 그렇지 않으면,

        21. Invalid라고 출력한다.

23. 가독성을 위해 공백을 주었다.

24. 그렇지 않으면 (이 부분은 8의 if에 해당되는 else이다)

    25. Invalid를 출력한다.

 

이제 내가 작성한 코드를 수정한 후 제대로 동작하는지 보자.

 

너무너무너무 잘 동작하고 있다. 비록 잠깐 혼자 엉뚱한 생각(?)을 했지만, 나름 뿌듯~

 

반응형