일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- select
- join
- 혼공챌린지
- SQL
- 알고리즘
- 자바
- java
- 인프런
- 카카오코테
- 정보처리기사
- 자료구조
- MySQL
- CS
- 기술면접
- Android
- 혼공단
- 혼공파
- 코테
- Kotlin
- 스터디
- 정처기
- 코틀린
- 안드로이드
- 티스토리챌린지
- 오블완
- Til
- groupby
- doitandroid
- 프로그래머스
- 안드로이드스튜디오
- Today
- Total
Welcome! Everything is fine.
[5주차] Python 100 문제풀이 Part.3 - 알고리즘, 문자열 본문
💡 알고리즘
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월을 끝냈을지도 모르는데 이렇게 뭐라도 해서 참 다행이라는 생각이 들었다. 혼자 하면 미룰 수 있었던 강의를 다 들은 것만으로도 작은 발전이다. 또 내가 많이 부족하다는 것도 느꼈기 때문에 남은 방학도 열심히 보내야겠다.
'자격증 및 기타 활동 > 여름방학 스터디(Python)' 카테고리의 다른 글
[4주차] Python 100 문제풀이 Part.3 - 모듈 (0) | 2021.07.29 |
---|---|
[3주차] Python 100 문제풀이 Part.3 - OOP (0) | 2021.07.22 |
[2주차] Python 100 문제풀이 Part.2 - 함수 (0) | 2021.07.15 |
[1주차] Python 100 문제풀이 Part.2 - 배열 (0) | 2021.07.07 |