Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

문제 18

문제:

한 웹사이트에서 사용자에게 등록을 위해 사용자 이름과 비밀번호를 입력하도록 요구합니다. 사용자가 입력한 비밀번호의 유효성을 확인하는 프로그램을 작성하십시오.

다음은 비밀번호 확인 기준입니다:

  • [a-z] 사이의 문자 최소 1개
  • [0-9] 사이의 숫자 최소 1개
  • [A-Z] 사이의 문자 최소 1개
  • [$#@] 중 문자 최소 1개
  • 거래 비밀번호 최소 길이: 6
  • 거래 비밀번호 최대 길이: 12

프로그램은 쉼표로 구분된 비밀번호 시퀀스를 입력받아 위의 기준에 따라 확인해야 합니다. 기준을 충족하는 비밀번호는 각각 쉼표로 구분하여 인쇄해야 합니다.

예시

다음 비밀번호가 프로그램에 입력으로 주어지면:

ABd1234@1,a F1#,2w3E*,2We3345

그러면 프로그램의 출력은 다음과 같아야 합니다:

ABd1234@1

힌트:

질문에 입력 데이터가 제공되는 경우 콘솔 입력으로 간주해야 합니다.


주요 저자 솔루션: 파이썬 2

import re
value = []
items = [x for x in raw_input().split(',')]
for p in items:
    if len(p) < 6 or len(p) > 12:
        continue
    else:
        pass
    if not re.search("[a-z]",p):
        continue
    elif not re.search("[0-9]",p):
        continue
    elif not re.search("[A-Z]",p):
        continue
    elif not re.search("[$#@]",p):
        continue
    elif re.search("\s",p):
        continue
    else:
        pass
    value.append(p)
print ",".join(value)

내 솔루션: 파이썬 3

def is_low(x):                  # 문자열에 소문자가 있으면 True를 반환합니다.
    for i in x:
        if 'a'<=i and i<='z':
            return True
    return  False

def is_up(x):                   # 문자열에 대문자가 있으면 True를 반환합니다.
    for i in x:
        if 'A'<= i and i<='Z':
            return True
    return  False

def is_num(x):                  # 문자열에 숫자가 있으면 True를 반환합니다.
    for i in x:
        if '0'<=i and i<='9':
            return True
    return  False

def is_other(x):                # 문자열에 "$#@" 중 하나라도 있으면 True를 반환합니다.
    for i in x:
        if i=='$' or i=='#' or i=='@':
            return True
    return False

s = input().split(',')
lst = []

for i in s:
    length = len(i)
    if 6 <= length and length <= 12 and is_low(i) and is_up(i) and is_num(i) and is_other(i):   # 모든 요구 사항이 충족되었는지 확인합니다.
        lst.append(i)

print(",".join(lst))

또는

def check(x):
    cnt = (6<=len(x) and len(x)<=12) # cnt는 초기에 조건 (6<=len(x) and len(x)<=12)이 참이면 1, 거짓이면 0이 됩니다.
    for i in x:
        if i.isupper():
            cnt+=1 # 대문자가 있으면 cnt를 1 증가시킵니다.
            break
    for i in x:
        if i.islower():
            cnt+=1 # 소문자가 있으면 cnt를 1 증가시킵니다.
            break
    for i in x:
        if i.isnumeric():
            cnt+=1 # 숫자가 있으면 cnt를 1 증가시킵니다.
            break
    for i in x:
        if i=='@' or i=='#'or i=='$':
            cnt+=1 # 특수문자가 있으면 cnt를 1 증가시킵니다.
            break
    return cnt == 5               # 총 5가지 조건이 모두 충족되면 True를 반환합니다. (길이 조건 + 4가지 문자 유형 조건)

s = input().split(',')
lst = filter(check,s)             # filter 함수는 check() 함수에 의해 True를 반환하는 s의 단어를 선택합니다.
print(",".join(lst))

또는

import  re

s = input().split(',')
lst = []

for i in s:
    cnt = 0
    cnt+=(6<=len(i) and len(i)<=12)
    cnt+=bool(re.search("[a-z]",i))      # 여기서 re 모듈에는 re.search() 함수가 포함되어 있으며, 이 함수는 패턴 문자열 i가 [a-z]/[A-Z]/[0-9]/[@#$] 문자 중 하나와 일치하는 위치의 객체 정보를 반환합니다.
    cnt+=bool(re.search("[A-Z]",i))      # 일치하는 항목이 하나도 없으면 NONE을 반환하며, 이는 부울 표현식에서 False로 변환됩니다. 일치하는 항목이 있으면 True입니다.
    cnt+=bool(re.search("[0-9]",i))
    cnt+=bool(re.search("[@#$]",i))
    if cnt == 5:
        lst.append(i)

print(",".join(lst))

'''솔루션 작성자: pratikb0501
'''
import re
a = input('비밀번호 입력: ').split(',')
pass_pattern = re.compile(r"^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[$#@]).{6,12}$") # 정규 표현식: 숫자, 소문자, 대문자, 특수문자($#@)를 각각 하나 이상 포함하고 길이는 6~12자여야 함
for i in a:
    if pass_pattern.fullmatch(i): # fullmatch는 전체 문자열이 패턴과 일치하는지 확인
        print(i)

또는

import re
def multiple (patterns, string):
  for i in patterns:
    if not re.search(i, string): # 각 패턴에 대해 문자열 검색
      return False
  
  if 6 <= len(string) <= 12: # 길이 확인
    return True
  else:
    return False
x = str(input("비밀번호 입력: "))
patterns = [r"[a-z]", r"[A-Z]", r"[0-9]", r"[$|#|@]"] # 패턴 리스트
print(multiple(patterns, x))

문제 19

문제:

(이름, 나이, 점수) 튜플을 오름차순으로 정렬하는 프로그램을 작성해야 합니다. 여기서 이름은 문자열이고 나이와 점수는 숫자입니다. 튜플은 콘솔을 통해 입력됩니다. 정렬 기준은 다음과 같습니다:

  • 1: 이름 기준 정렬
  • 2: 그런 다음 나이 기준 정렬
  • 3: 그런 다음 점수 기준 정렬

우선순위는 이름 > 나이 > 점수입니다.

다음 튜플이 프로그램에 입력으로 주어지면:

Tom,19,80
John,20,90
Jony,17,91
Jony,17,93
Json,21,85

그러면 프로그램의 출력은 다음과 같아야 합니다:

[('John', '20', '90'), ('Jony', '17', '91'), ('Jony', '17', '93'), ('Json', '21', '85'), ('Tom', '19', '80')]

힌트:

질문에 입력 데이터가 제공되는 경우 콘솔 입력으로 간주해야 합니다. 여러 정렬 키를 사용하려면 itemgetter를 사용합니다.


주요 저자 솔루션: 파이썬 2

from operator import itemgetter, attrgetter

l = []
while True:
    s = raw_input()
    if not s:
        break
    l.append(tuple(s.split(",")))

print sorted(l, key=itemgetter(0,1,2))

내 솔루션: 파이썬 3

lst = []
while True:
    s = input().split(',')
    if not s[0]:                          # 빈 입력이면 중단합니다.
        break
    lst.append(tuple(s))

lst.sort(key= lambda x:(x[0],int(x[1]),int(x[2])))  # 여기서 키는 람다로 정의되고 데이터는 요소 우선순위 0>1>2에 따라 오름차순으로 정렬됩니다.
print(lst)

결론

위의 문제를 풀기 전에는 re(정규 표현식) 모듈과 그 사용법에 대해 전혀 몰랐습니다. 여러 키로 정렬하는 방법도 몰랐습니다. 이러한 문제를 다양한 방식으로 해결하기 위해 해당 구문을 탐색하고 배워야 했습니다. re 모듈에는 흥미로운 내용이 많지만 그중 많은 것을 이해하는 데 약간의 어려움을 겪었습니다.

이전 날로 가기

다음 날로 가기

토론