3주차 WIL(0917-0918 TIL)

looggi·2022년 9월 18일
1

스파르타 내배캠 AI-3

목록 보기
16/130
post-thumbnail

자료구조와 알고리즘🌷(복습?)

  • 알파벳 최빈값 구하기

input = "hello my name is sparta"


def find_max_occurred_alphabet(string):
    alphabet_occurrence_array = [0] * 26
    string = ''.join(string.split())
    # 원래 조인함수는 리스트에 써야되는데 string.split()하면 리스트에 담기니까 사용가능
    max_index = 0
    for i in range(len(string)):
        alphabet_occurrence_array[ord(string[i]) - ord('a')] += 1
    for i in range(len(alphabet_occurrence_array)):
        if alphabet_occurrence_array[i] == max(alphabet_occurrence_array):
            max_index = chr(i + ord('a'))
            # return chr(i + ord('a')) #if 종료(정답)
            return max_index #if 종료(정답)
        # return max_index  # for 종료(정답x) ->0출력
        # if문 실행 안되고 max_index는 계산된 적이 없는 상태로 for문 위 초기값 0으로 나옴
    # return max_index  # def 종료(정답)
    # max_index 초기값이 나오지 않으려면 다 계산된 다음(for문 다 돌리고) 리턴을 해줘야지 for문 계산 중간에 리턴하면 다 비교를 안해보고.. 출력된다

result = find_max_occurred_alphabet(input)
print(result)

return chr(i + ord('a')) 하는 경우⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️⭐️

-> if 조건을 만족시키면!! 리턴하는거니까 if문 안에 리턴을 해야한다!!!
-> for 에 리턴이 있으면 if문에 조건이 걸려있긴 하지만 첫번째 요소에 대해서만 if문이 실행되고 실제로 그 조건에 맞는 답을 리턴할 수 없다
-> for문과 return의 인덴트가 같으면 for문을 다 돌고난 후에야 리턴이 되니까 i에 그냥 맨 마지막 Z값이 반영된다


⭐️⭐️⭐️초기값 설정⭐️⭐️⭐️
초깃값은 엉뚱한거 하지말고 가장 기본적인걸로 생각해야함
count는 0으로, 배열 비교를 하려면 가장 첫번째값으로!

input_ = "best of best sparta"


def find_max_occurred_alphabet(string):
    alphabet_list = 'a b c d e f g h i j k l m n o p q r s t u v w x y z'.split()
    max_occurrence = 0
    max_alphabet = alphabet_list[0]
    # max_alphabet 초기화를 for문 안에서하면 값이 계속 초기화되잖아ㅠㅠㅠㅠㅠ
    for alphabet in alphabet_list:
        occurrence = 0
        # for i in range(len(alphabet_list)):
        for char in string:
            # if char == alphabet_list[i]:
            if char == alphabet:
                occurrence += 1
        if occurrence > max_occurrence:
            max_occurrence = occurrence
            max_alphabet = alphabet

    return max_alphabet


result = find_max_occurred_alphabet(input_)
print(result)

def find_alphabet_occurrence_array(string):
    alphabet_occurrence_array = [0] * 26
    for char in string:
        if not char.isalpha():
            continue
        index_arr = ord(char) - ord('a')
        alphabet_occurrence_array[index_arr] += 1
        # 몇번째(번호)가 필요하다고해서 꼭 for i in range()를 쓸 필요가 없다!

# 여기서부터 어떻게 찾지가 아니라 리스트 안에서 최댓값 찾는 거랑 로직이 똑같음
# 제일 큰 값을 찾고
# 그 값의 인덱스를 찾고
# 그 인덱스에 해당하는 알파벳을 찾으면 됨
    max_occurrence = 0
    max_index = 0
    for index in range(len(alphabet_occurrence_array)):
        if alphabet_occurrence_array[index] > max_occurrence:
            max_occurrence = alphabet_occurrence_array[index]
            max_index = index
    return chr(max_index+ord('a'))


print(find_alphabet_occurrence_array("oh i also liked it it was the besttttt ever"))

알고리즘

와 기본수학 첫번째 문제에서 이렇게 헤맬줄이야.. 수학식으로 풀면 진짜 쉬운건데 코드로 표현하려니 이전 문제들이랑은 또 다르다 희한한다
출력초과는 도대체 어떻게 난건가하면
반복문 계속 돌리기^^
어디에 뭘 써야하는지 감이 안잡혀서 10번 틀렸다 ㅋㅋㅋ 진짜 현타 씨게온당
내가 깨달은 바로는 당연하게도 조건을 적어야하는 자리에 조건을 적고
값을 내는 자리에 값을 적어야한다는 것
밤이라 제정신이 아니었던거라고 생각하고 싶당ㅎㅅㅎ


9/14 강의 복습

  • number = 'string'
    int(number)
    -> ValueError
  • try-except 문은 if else 랑 같은 맥락
  • except exception as e:
    -> 에러가 지정된 게 아니라 어떻게 에러가 난건지 알기 어렵다 권장❌ (에러는 특정짓는것이 좋다)
    -> e 대신 다른 단어도 가능 but 보통 이렇게 씀
    -> e를 프린트하면 에러내용이 들어감
print(f'에러발생:{e}')
  • pass는 통과 continue는 반복문 내부에서 다음 반복문으로 넘기기
  • 리스트 축약식은 리스트,튜플,셋 반복 가능한 자료형에 사용
    -> [최종적으로 리스트에 뽑히는(들어가는) 결과 for x(리스트의 임의의 한 요소) in iterable]
  • 리스트 축약식은 가독성이 떨어질 것 같으면 쓰지 않는 게 좋다
  • 딕셔너리 축약식(⭐️딕셔너리 괄호⭐️)
    ->{딕셔너리 형식⭐️ for 뽑을 요소들 in 리스트등..}❓
from pprint import pprint
people = [
    ("lee", 32, "man"),
    ("kim", 23, "man"),
    ("park", 27, "woman"),
    ("hong", 29, "man"),
    ("kang", 26, "woman")
]
people_1 = [person[0] for person in people]
pprint(people_1)
# 리스트에 담긴다
# ['lee', 'kim', 'park', 'hong', 'kang']


people_2 = {(name,gender):age 
for name, age, gender in people}
pprint(people_2)
# 딕셔너리에 담긴다
# 알아서 각 행의 요소들을 순서대로 변수에 담는다
#{('hong', 'man'): 29,
# ('kang', 'woman'): 26,
# ('kim', 'man'): 23,
# ('lee', 'man'): 32,
# ('park', 'woman'): 27}
  • from 모듈 import 함수
    -> 라이브러리에따라 from을 안적고 함수 앞에 '모듈명.함수'를 적어주는 게 좋을 수 있다
    -> 라이브러리 도큐먼트 참고
  • map(함수, iterable)
    -> 함수는 lambda 형식을 사용
    -> map(lambda x:x*2, numbers)
  • list(filter(lambda x: x%2 == 0, numbers))
    ->람다 이하에 조건식이 들어가서 필터링의 기준이 됨
    ->리스트 축약식도 조건 걸기 가능함
    = [x for x in numbers if x%2==0]
  • 리스트.sort(key=람다식)
    -> 람다식은 보통 lambda x: 어쩌구
    -> 람다식 뒤에 ,reverse=True 추가하면 거꾸로
    ex) people.sort(key=lambda x: x[1])
  • 리스트.sort(key=lambda x:(x[0],x[1]))
    -> 튜플형식으로 정렬의 우선순위를 정해줄 수 있다
profile
looooggi

0개의 댓글