Welcome! Everything is fine.

[5주차] Python 100 문제풀이 Part.3 - 알고리즘, 문자열 본문

자격증 및 기타 활동/여름방학 스터디(Python)

[5주차] Python 100 문제풀이 Part.3 - 알고리즘, 문자열

개발곰발 2021. 8. 5.
728x90

💡 알고리즘

max( )/min( ) 함수 없이 최곳값, 최솟값 구하기

리스트에서 각 요소들 중 최곳값과 최솟값을 구할 때, 아래와 같이 max( ) 함수와 min( ) 함수를 사용하면 쉽게 구할 수 있다.

english_score = [33, 44, 55, 66, 77, 88, 99, 11, 22, 60]

print(max(english_score)) # 최곳값 99 출력
print(min(english_score)) # 최솟값 11 출력

 

그러나 max( ) 함수와 min( ) 함수 없이 구해야한다면  어떻게 해야할까? 먼저 최곳값을 구하는 함수를 아래와 같이 만들었다. 그러나 이 코드를 실행시키니 99라는 숫자가 한 번만 나와야하는데, 세 번이나 출력되었다. 살펴보니 99 이후에 11, 22, 60 이라는 숫자 3개가 99보다 작기 때문에 3번 출력 된 것이다.

def max_in_list(lst):
    first_max_number = 0
    for i in range(len(lst)):
        if lst[i] > first_max_number:
            first_max_number = lst[i]
        elif lst[i] <= first_max_number:
            print(first_max_number)

english_score = [33, 44, 55, 66, 77, 88, 99, 11, 22, 60]

max_in_list(english_score)

 

❔ 여러 값이 들어있는 리스트에서 최곳값을 출력하는 함수를 직접 구현하시오. 이때, max( ) 함수를 사용해서는 안된다.

다음은 이전의 코드를 고친 결과다. 각 요소를 돌면서 first_max_number에 들어간 숫자와 비교하여 해당 요소가 더 크다면 first_max_number에 대입한다. 그렇지 않다면 return을 사용하여 first_max_number에 들어있는 값을 반환한다.

def max_in_list(lst):
    first_max_number = 0
    for i in lst:
        if i > first_max_number:
            first_max_number = i
    return first_max_number

english_score = [33, 44, 55, 66, 77, 88, 99, 11, 22, 60]

print(max_in_list(english_score))

❔ 여러 값이 들어있는 리스트에서 최젓값을 출력하는 함수를 직접 구현하시오. 이때, min( ) 함수를 사용해서는 안된다.

그렇다면 최젓값은 어떻게 구할 수 있을까? 최젓값을 0으로 설정한다면 그냥 0이 그대로 출력될 수 있다. 그렇기 때문에 다음과 같이 초기 최솟값을 리스트의 첫번째 값으로 잡았다. 각 요소를 돌면서 요소의 첫 번째 값보다 작다면 first_max_number에 대입함으로써 최솟값을 구했다.

def min_in_list(lst):
    first_min_number = lst[0]
    for i in lst[1:]:
        if i < first_min_number:
            first_min_number = i
    return first_min_number        

english_score = [33, 44, 55, 66, 77, 88, 99, 11, 22, 60]

print(min_in_list(english_score))

학생 5명의 수학 점수를 입력받아 60점 이상만 합계를 구하는 코드를 구현하시오.

수학 점수를 입력받은 뒤 split( ) 함수를 사용하여 공백을 기준으로 나누면 입력한 점수를 요소로 가진 리스트가 만들어진다.  중요한 것은 이 리스트의 요소가 겉으로는 숫자로 보일지라도 사실은 문자라는 것이다. 따라서 합계를 구하기 위해서는 int로 감싸주어 문자를 정수로 만들어주어야 한다.

scores = input("학생 5명의 수학 점수를 입력하세요 : ").split()

sum = 0
scores_num = len(scores)

for i in range(0, scores_num):
    if int(scores[i]) >= 60:
        sum += int(scores[i])

print(f"학생 {scores_num}명의 입력 점수 중 60점 이상의 합계는? {sum}점 입니다.")

삽입 정렬 알고리즘

정렬 알고리즘중 삽입 정렬 알고리즘을 그림으로 설명하고 코드로 구현하시오.

삽입 정렬이란, 정렬 대상이 자기 위치를 찾아서 들어가는 방식의 정렬을 말한다. 다음은 삽입 정렬을 그림으로 설명한 것이다.

위 그림을 코드로 나타내면 다음과 같다. for 문에서는 (리스트 요소의 개수 - 1)만큼 반복하도록 했다. lst[1]부터 비교를 시작하기 때문이다. while 문에서는 조건으로 i값이 0 보다 큰 것과 왼쪽 값이 오른쪽 값보다 클 경우를 적었다. 조건에 충족하면 lst[i - 1] 과 lst[i]를 swap한 후, 이전 인덱스로 가서 또 비교할 수 있도록 i를 1 줄였다. 간단한 swap 방법이지만 잘 떠오르지 않아서 더 연습해봐야 할 것 같다.

lst = [4, 8, 1, 5, 7]
print("[1] 삽입 정렬 전 : ", lst)

for i in range(1, len(lst)):
    while i > 0 and lst[i - 1] > lst[i]:  
        lst[i - 1], lst[i] = lst[i], lst[i - 1]    
        i -= 1 # 

print("[2] 삽입 정렬 후 : ", lst)

💡 문자열

문자열 거꾸로 출력시키기

사용자가 입력한 문자열을 거꾸로 출력시키는 함수를 구현하시오.

str_ = input("2개 이상의 문자를 입력해주세요 = ")

def reverse_txt(str_):
    print(str_[::-1])	# 마이너스(-)가 붙으면 역방향

reverse_txt(str_)

 [start : end : step] 으로 사용할 수 있다. 만약 다음과 같이 수정하고 "안녕하세요"를 입력하면 "녕세" 두 글자만 출력된다.

str_ = input("2개 이상의 문자를 입력해주세요 = ")

def reverse_txt(str_):
    print(str_[1:4:2])

reverse_txt(str_)

❔ 아래 코드의 결과로 출력되는 값을 예상하여 말해보시오.

# [1] : 함수 작성
def reverse_txt( str_ ):
    count = 0
    txt = ''
    for letter in str_:
        txt = letter + txt
        count += 1
        if count > 2:
            break
    return txt


# [2] : 함수 호출
result = reverse_txt("korea")
print(result)

✔ letter 와 txt가 더해지는 순서에 주의하면 된다. 처음 letter 에는 'k'가 들어갈 것이고, 그 다음에는 차례로 'o' 와 'r'이 들어갈 것이다. count가 2가 되면 반복문을 빠져나오므로 'r'까지 들어갈 것인데, txt + letter 순이 아닌 letter + txt 순으로 더해지기 때문에 'k' - 'ok' - 'rok' 순으로 더해진다. 따라서 출력되는 값은 'rok' 이다.

join( ) 함수

❔ 리스트내 요소 값들을 하나의 문자열로 이어서 출력시키는 함수를 구현하시오. 이때 문자 사이사이에 별표(*)를 넣어서 출력시키시오.

def convert_lst_str(lst):
    return '*'.join(lst)

print(convert_lst_str(['k', 'o', 'r', 'e', 'a']))

리스트 슬라이스 관련 문제

리스트 관련 문제는 다 설명하기엔 너무 많아서 실습한 코드를 가져왔다. 리스트 슬라이스는 쉽지만 안보면 금세 까먹기 때문에 반복적인 연습이 필요할 것 같다.

lst1 = [1,2,3,4,5,6,7,8,9,10]

print("1부터 4까지의 요소를 갖는 리스트 -->",lst1[1:3])
print("3번째 요소에서 맨 끝까지 출력 -->",lst1[3:])
print("처음부터 특정요소까지 출력 -->",lst1[:4])
print("모든 요소 출력 -->",lst1[:])

lst2 = ['a','b','c','d','e','f','g','h','i','j']

print("c, d, e 문자 출력 -->", lst2[2:5])
print("e, f, g, h 문자 역인덱스로 출력 -->", lst2[-6:-2]) # i의 역인덱스까지 적어줘야함
print("len()함수로 작성하여 d부터 끝까지 출력 -->", lst2[3:len(lst2)])
print(lst2[1:len(lst2)-8]) # b 출력, 왜냐하면 lst2[1:2] 니까!
print(lst2[10:2]) # 에러는 나지 않는다. 빈리스트[] 를 만든다.
print("lst2[1:3][1]의 결과는? -->", lst2[1:3][1]) # c
print("lst2[1:4][:]의 결과는? -->", lst2[1:4][:]) # b, c, d
print("lst2[2:6][1:-1]의 결과는? -->", lst2[2:6][1:-1]) # d, e -1의 전까지 나옴
print(''.join(lst2))

# 리스트 내 중복 제거 --> set()
ar = [1,2,3,4,5,5,5]
print(list(set(ar)))

# 아래 리스트에서 앞에(또는 뒤에) 문자 5만 남기고 나머지 모두 삭제하려면?
ar1 = ['a','b','c','d','e','f','g','h','i','j']
ar2 = ['a','b','c','d','e','f','g','h','i','j']

del ar1[5:]
print(ar1)

del ar2[:5]
print(ar2)

📌 스터디 종료

오늘부로 스터디가 끝났다. 지금까지 같이 해주신 스터디원분들께 감사하고, 자칫 잘못하면 아무것도 안한 채 7월을 끝냈을지도 모르는데 이렇게 뭐라도 해서 참 다행이라는 생각이 들었다. 혼자 하면 미룰 수 있었던 강의를 다 들은 것만으로도 작은 발전이다. 또 내가 많이 부족하다는 것도 느꼈기 때문에 남은 방학도 열심히 보내야겠다.