알쏭달쏭 공부한거 쓰기

HW5 과제 풀이 본문

파이썬 -23여름학기(ㄱㅎㅈ)

HW5 과제 풀이

elec_cy 2023. 7. 2. 22:38

## 아래 코드의 실행 결과를 예측하시오.> 내생각에는 필기시험 문제일것으로 예상된다.
###1.
```
for e in ['a', 1, 2, [3, 4]]:
    print(e, end = ' ')
print()    
```

예상)'a'12[3,4]

결과)1 2 [3, 4]

-변수가 아닌 문자라는 의미에서'a'를 쓰는것이므로 출력은 문자a가 나오는 것이다.

 


###2.
```
for e in ['a', 1, 2, [3, 4]]:
    print('e', end = ' ')
print()   
```

예상) 위에랑 같을것이다.

결과) e e e e

-받아들이는 값이 변수인지 문자열인지 판단하자.


###3.
```
for e in 'hello world':
    print(e, end = '+')
print()
```

예상)h+e+l+l+o+ +w+o+r+l+d+

결과) h+e+l+l+o+ +w+o+r+l+d+


###4.
```
for x in range(2):  #1
    for y in range(ord('a'), ord('d')): #range(97,100)
        print(x, chr(y))
print()
```

새로운 개념:

ord(문자): 해당문자에 해당하는 유니코드 값을 반환한다.

chr(정수): 해당유니코드 값에 해당하는 문자를 반환한다.

예상)

0,a

0,b

0,c

0,d

1,a

1,b

1,c

1,d

 

결과)

0 a
0 b
0 c
1 a
1 b
1 c

-range(97,100)이니까 범위는 97 98 99이다.


### 5.
```
m = 10
for x in 'python test 1, 2, 3!':
    if x.isdigit()==True:
        m *= int(x)
print(m)
```

예상)# 10*1*2*3

60

결과)

60

 

#문자열 1번 문제

## 1. 사용자로부터 휴대 전화 번호를 입력받아 아래와 같이 출력하는 프로그램을 작성하시오.
 - 사용자 입력에 숫자가 아닌 문자가 있다면 다시 입력 받을 것.  
 - 번호가 010으로 시작하지 않는다면 다시 입력 받을 것.
 - 입력 값 출력 시,  전화번호 끝자리는 4자리라고 간주한다.
 ---
 실행 결과
 ```
휴대전화번호: 010-1234-5678
잘못된 전화번호입니다.
휴대전화번호: 0531234567
잘못된 전화번호입니다.
휴대전화번호: 01012345678
입력하신 번호는 010-1234-5678입니다.

```

sol)

while True:
        user=input('휴대전화번호:')
        
        #010-7571-4489         
        if user[:3]!='010':
            print('잘못된 전화번호 입니다.')
        elif user.isdigit()==False:  #문자 하나씩 검사 안 하고 전체 검사 가능
            print('잘못된 전화번호 입니다.')
        else:
            break
        
    #user=01012345678
    phone=[user[:3],user[3:-4],user[-4:]]
    print(f"입력하신 번호는 {'-'.join(phone)}입니다.")
    #join이랑 fstring 쓸 때 주의해야한다.

교수님)

 while True: 
        phn_nbr = input('휴대전화번호:')
        if phn_nbr.isdigit()==False: 
            print('[입력 오류] 번호는 숫자로만 입력바래요.')
        elif phn_nbr[:3] != '010': 
            print('[입력 오류] 번호는 010으로 시작합니다.')
        else: 
            print(f'입력하신 번호는 010-{phn_nbr[3:-4]}-{phn_nbr[-4:]}입니다.')
            break

 

#day4 랜덤포듈 3번 문제

## 3. 알파벳, 숫자, 특수 문자로 구성된 8자리 임시 암호를 생성하는 프로그램을 작성하시오.

---
실행 결과

```
mV1Z8R&h
```

sol)

1)choice를 이용한 경우

def hw3():
    a=[str(x) for x in range(1,10)]
    #알파벳을 만들어보자
    
    for i in  range(ord('A'),ord('Z')+1):
        a.append(chr(i))
    #특수 문자 추가하쟈
    for j in '!@#$%&*?/':  
        a.append(j)
         
    for _ in range(8):
        print(rd.choice(a),end='')

2)sample이용한 경우

 

2-1) 내가 짠 코드

 #출력할떄마다 새로운 임시암호를 작성해야해
    #숫자, 알파벳, 특수 구문을 포함하고 있는
    #숫자를 만들어보자
    #a=list(range(1,10))>이럴 경우 정수랑 문자열 둘다 포함되어 있어서 join이 작동하지 않는다.
    a=[str(x) for x in range(1,10)]
    #알파벳을 만들어보자
    
    for i in  range(ord('A'),ord('Z')+1):  #range는 마지막 번호는 포함하지 않으니까
        a.append(chr(i))
    #특수 문자 추가하자
    for j in '!@#$%&*?/':  
        a.append(j)

    b=rd.sample(a,8)
    print(b)
    #b=''.join(b)#join은 원본을 안 바꿈 반환은 하는데..?b에 정수가 포함되어 있기 때문이다.

2-2) gpt가 짠거

def hw1():
    a = list(range(1, 10))
    
    for i in range(ord('A'), ord('Z')+1):
        a.append(chr(i))
    
    for j in '!@#$%&*?/':  
        a.append(j)
    
    b = rd.sample(a, 8)
    b = ''.join(map(str, b))  # 반환된 값을 문자열로 변환
    
    print(b)

2-3)

def hw2():
    a = list(range(1, 10))
    
    for i in range(ord('A'), ord('Z')+1):
        a.append(chr(i))
    
    for j in '!@#$%&*?/':  
        a.append(j)
    
    b = rd.sample(a, 8)
    b = ''.join(str(x) for x in b)  # 요소를 문자열로 변환
    
    print(b)

2-4)

def 임시_암호_생성():
    숫자 = [str(x) for x in (range(0, 10))]
    알파벳 = [chr(i) for i in range(ord('A'), ord('Z')+1)]
    특수문자 = list('!@#$%&*?/')
    
    a = 숫자 + 알파벳 + 특수문자    #나는 append했는데 그냥 다 따로 list처리후 이렇게 더할 수도 있겠네
    
    임시_암호 = ''.join(rd.sample(a, 8))
    
    return 임시_암호

print(임시_암호())  #함수 안에는 print가 없으므로 호명시 반드시 print로 호명

 

2-5)

import random
import string


def 비밀번호_생성():
    characters = string.ascii_letters + string.digits + string.punctuation
    비밀번호 = ''.join(random.sample(characters, 8))
    return 비밀번호

 

sol) 교수님

pw = '' #패스워드를 저장
    #아래 반복문을 통해 한자리씩 생성하여 pw에 추가
    #알파벳, 숫자, 특수문자(즉, 아스키 코드(0~127까지의 코드 값으로 표현 가능)로 표현될 수 있는 문자)로 구성되므로 0~127의 랜덤넘버 생성
    
    for _ in range(8): 
        while True: 
            x = chr(rd.randrange(128))#0이상 128미만의 랜덤 넘버 생성 후 해당 코드값의 문자로 변환
            #예) chr(97) = a-> chr(97)은 아스키 코드값이 97인 문자 a가 됨. 
            if x.isprintable()==True and x!=' ': #이 x가 출력가능한 문자이고, 공백이 아닌 경우에만 비밀번호로 인정. 
                break 
        pw += x  #'a'+'b'='ab'와 동일한것 문자열 덧셈을 이용함
    
    print('임시 암호:', pw)

 

6일차 실습 문제 -5.18

## 5.18 s_list = ['abc', 'bcd', 'bcdefg', 'abba', 'cddc', 'opq']와 같은 문자열을 가진 리스트가 존재한다. 이 리스트에 대하여 다음과 같은 기능을 구현하여라.

### 1) min() 함수나 sort() 메소드를 사용하지 말고, s_list 내의 문자열 항목중에서 가장 길이가 짧은 문자열을 출력하여라.
 - 길이가 가장 짧은 문자열이 여러개 있을 경우 아래 출력과 같이 제일 먼저 나타나는 문자열을 출력하여라: 제일 나중에 나타나는 문자열은 어떻게 출력할까?


---
실행 결과
```
가장 길이가 짧은 문자열 : abc

```

sol)

s_list = ['abc', 'bcd', 'bcdefg', 'abba', 'cddc', 'opq']
    short=s_list[0]
    for i in s_list:
        if len(short)>len(i):
            short=i
            
    print(f'가장 길이가 짧은 문자열:{short}')


### 2) 1) 번 문제에서 'abc', 'bcd', 'opq'의 세 문자열의 길이가 3으로 모두 같다. 이와 같이 문자열의 길이가 같을 경우 다음과 같이 가장 길이가 짧은 문자열 3개를 모두 출력하는 프로그램을 작성하여라. sort(key=len) 함수를 사용하여 길이에 따라 정렬한 후 코드를 작성하여라.

---
실행 결과

```
가장 길이가 짧은 문자열 : 'abc', 'bcd', 'opq'
``

sol)

s_list = ['abc', 'bcd', 'bcdefg', 'abba', 'cddc', 'opq']
    #길이로 나열
    s_list.sort(key=len)
    shortlen=len(s_list[0])
    short_stirng=[]
    
    for string in s_list:
        if len(string)==shortlen:
            short_stirng.append(string)
        else:
            break
    print(short_stirng)

sol-교수님)

s_list = ['hello', 'abc', 'bcd', 'bcdefg', 'abba', 'cddc', 'opq']
    
    s_list.sort(key = len) 
       
    #길이가 가장 짧은 문자열이 3개인 걸 아는 경우
    #print('길이가 가장 짧은 문자열:', s_list[:3]) 
    print('길이가 가장 짧은 문자열: ', end = '')
    min_len = len(s_list[0])
    
    for word in s_list: 
        if len(word)==min_len: 
            print(word, end = ' ')
        else: #길이순으로 정렬되어 있으므로 길이가 다른 게 나오면 가장 짧은 문자열은 모두 출력한 후이므로 반복 탈출
            print()
            break

-리스트에 하나씩 넣거나 또는 하나씩 출력하거나

 

cf)

내가 궁금한 것

문자열을 요소로 가진 list를 str로 하면 문자열이 합쳐진것이 나올까?

no

>>> a=['a','b','c']
>>> str(a)
"['a', 'b', 'c']"