TIL : Python / Algorithm

hihyeon_cho·2022년 11월 9일
1

TIL

목록 보기
8/101

python

tuple

: ( ) 로 묶어준 자료형, 불변형이다.

a = ('호떡','붕어빵','호빵')

# 변형하려고 하면 에러가 발생한다. 
# a[1] = '핫초코' => 에러

print(a[1])

set(집합)

a = [1,2,3,4,5,6,7,8,9,5,3,2,1,5,2]
a_set = set(a) # 중복이 제거되서 나옴
print(a_set)
  • 교집합, 합집합, 차집합 구하기

    a=['곰','호랑이','강아지','고양이','토끼','햄스터']
    b=['토끼','호랑이','북극곰','고양이','강아지','알파카']
    a_set = set(a)
    b_set = set(b)
    
    print(a_set & b_set) # 교집합구하기
    print(a_set | b_set) # 합집합구하기
    print(a_set - b_set) # 차집합구하기

f-string

scores = [
    {'name':'민지','score':90},
    {'name':'하니','score':65},
    {'name':'해린','score':75},
]

for s in scores:
    name = s['name']
    score = str(s['score'])
    print(name + '의 점수는 ' + str(score) +'점 입니다.') 
    # 위처럼 출력한 내용을 f-string을 이용해 아래와 같이 쓸 수 있다.
    print(f'{name}의 점수는 {score}점 입니다.') 
    # f-string 사용은 앞에 f만 붙이면 됨!

예외처리

: 에러로 인해 작업이 중단되지 않고, 계속 실행될 수 있도록 함.

people = [
    {'name': 'ive', 'age': 20},
    {'name': 'jeans', 'age': 38},
    {'name': 'black' },
    {'name': 'pink', 'age': 42},
    {'name': 'aespa', 'age': 15}
]

for person in people: # 에러로 인해 작업이 중단되지 않고, 계속 실행될 수 있도록 함.
    try:
        if person['age'] > 20:
            print(person['name'])
    except:
        print(person['name'], '에러입니다.')

파일불러오기

: from 뒤에 파일이름 적고 import하기.
import * 은 전부 불러오기, import 원하는 함수명 으로 원하는 함수만 불러올 수도 있음

  • 파일_1을 파일_2에 불러오기
# 파일_1
def say_hi():
    print('안녕!')

def say_hi_to(name):
    print(f'{name}님 안녕하세요!')
# 파일_2
from main_func import say_hi_to

#  say_hi()는 호출하지 않아 파일_2에 작성할 경우 에러.
say_hi_to('희현')

코드줄이기

if문 (삼항연산자)

: (True 값) if (조건) else (False 값)으로 항이 3개이다.

num = 5

# if num % 2 == 0:
#     result = '짝수'
# else:
#     result = '홀수'
# 위의 코드를 아래와 같이 축약해서 작성할 수 있다.

result = ('짝수'if num % 2 == 0 else '홀수')

print(f'{num}{result}입니다.')

for문

a_list = [1,4,5,6,2]

b_list = []

# for a in a_list:
#     b_list.append(a*2)
# 위의 코드를 아래와 같이 쓸 수도 있다. 

b_list = [a*2 for a in a_list]
# a_list 안에 있는 a를 돌리는데, 그때마다 a에 2를 곱하고 리스트로 묶어라

print(b_list)
# => [2, 8, 10, 12, 4]

map,filter,lambda식

map

: 리스트의 모든 원소를 조작하기

  • lambda식은 익명함수라고도 함
    'lambda x:' 로 매개변수를 받고 ' : '뒤의 내용을 반환한다.
people = [
    {'name': 'ive', 'age': 20},
    {'name': 'jeans', 'age': 18},
    {'name': 'black', 'age': 50},
    {'name': 'pink', 'age': 42},
    {'name': 'aespa', 'age': 15}
]

def check_adult(person):
if person['age'] > 20 :
     return '성인'
 else :
     return '청소년'
     return ('성인' if person['age'] > 20 else '청소년') 


result = map(lambda person:('성인' if person['age'] > 20 else '청소년'),people)
# people을 가지고 하나씩 person에 넣으면서 돌텐데, 그 person을 가지고 이렇게 리턴해라

filter

: True인것만 나타내라!

result = filter(lambda x: x['age'] > 20, people)

print(list(result))  # return 값을 리스트를 만들어라

함수의 매개변수

  • 매개변수는 직접 값을 지정할 수 있다.

    def cal(a, b):
        return a + 2 * b
    
    result = cal(b=2, a=1)  # 매개변수에 직접값을 지정하면 순서를 안맞춰도 된다.
    
    print(result)
  • 특정 매개변수에 디폴트 값을 지정할 수 있다.

    def cal(a, b=2):
        return a + 2 * b
    
    result1 = cal(1) # b를 안넣어도 계산이 됨.
    result2 = cal(1,3) # 넣은 값으로 계산이 됨 
    print(result1) =>5
    print(result2) =>7
  • *args
    :변수(인자)를 무제한으로 넣을 수가 있음 => list로 받아서 쓸 수 있음

    def cal(*args) 
        for name in args:
            print(f'{name}야 놀자~')
    cal('짱구','철수','유리')
  • **kwargs
    : 키워드 인수를 여러 개 지정해서 넣을 수 있다.
    딕셔너리로 출력되어, 그대로 갖다 쓸 수 있게 만들어 놓았고, 추가도 가능하다. 라이브러리의 코드를 헤쳐서 볼때 도움이 된다고 함.

    def cal(**kwargs):
        print(kwargs)
    
    cal(name = 'bob',age = 30, height = 178)
    # => {'name': 'bob', 'age': 30, 'height': 178}
    

클래스

: 똑같은 무엇인가를 계속해서 만들어 낼 수 있는 설계 도면

# 예시로 게임의 몬스터를 class로 만듬
class Monster():
    hp = 100
    alive = True

    def damage(self, attack):
        self.hp = self.hp - attack
        # 내 hp니까 self. / 내 hp에서 attack만큼 줄어들거야!!
        if self.hp < 0: # 내 hp가 0보다 작아졌다면
            self.alive = False # alive 상태가 False

    def status_check(self): # 살았는지 죽었는지 반환
        if self.alive == True:
            print('alive')
        else:
            print('dead')
            
m1 = Monster()
m1.damage(150) # 데미지를 150주었다.
m1.status_check() # => dead

m2 = Monster()
m2.damage(98) # 데미지를 98주었다.
m2.status_check() # => alive          

Algorithm

알고리즘이란?

: 알고리즘은 문제를 해결하기 위한 여러가지 동작들의 모임.
( 요리할 때, 도구와 재료가 자료구조라면 레시피가 알고리즘 ! )

알고리즘의 중요성

적은 공간, 빠른 속도로 수행되는 프로그램이 좋은 프로그램이기 때문에,
그런 프로그램을 구현하기 위해 알고리즘을 알아야한다.

문제풀이

이중반복문 & for else문

input = [3, 5, 6, 1, 2, 4]


def find_max_num(array):
    for num in array:
        for compare_num in array:
        # 이중반복문 ! 대조군과 비교하기위해 이중반복문을 사용함.
            if num < compare_num:
                break 
        # 대조군인 num을 compare_num과 비교했을 때 작으면 해당 대조군의 반복을 멈추고
        else: 
        # for else 문 : break가 동작하지 않았을 때의 코드를 작성
            return num # 남은 대조군의 반복을 실행하여 살아남은 num을 return함.


result = find_max_num(input)
print(result)

if not = 필터

def find_alphabet_occurrence_array(string):
    alphabet_occurrence_array = [0] * 26 
    #비트맵자료구조 : 내 특정인덱스에 카운팅을 늘리고, 이 인덱스에 대한 카운팅을 얻기 위해 쓰는 자료구조 / 26개의 카운팅을 쉽게 기록하기 위해서
    for char in string: # string 안에서 char라는 변수로 반복문 실행
        if not char.isalpha(): #필터링 과정 : 알파벳이 아니면 넘기자는 의미!
            continue
        arr_index = ord(char) - ord('a') 
        #char의 아스키코드 값에서 a의 아스키 코드값을 빼면 해당 알파벳의 인덱스가 나옴.
        alphabet_occurrence_array[arr_index] += 1 
        # 해당 인덱스가 나올때마다 그 인덱스 값에 1을 추가한다.

    return alphabet_occurrence_array # array를 리턴


print(find_alphabet_occurrence_array("hello my name is sparta"))

input = "hello my name is sparta"

ord() chr()

: ord()는 문자를 아스키코드로 변환해 주는 함수
chr()은 아스키 코드 값을 문자로 변환해 주는 함수

input = "hello my name is sparta"


def find_max_occurred_alphabet(string):
    # 알파벳 별 빈도수를 저장하기 위한 길이가 26인 0으로 초기화된 배열을 만든다.
    alphabet_occurrence_array = [0] * 26
    # string 안에서 char라는 변수를 담아서 꺼낸다.
    for char in string:
        # 만약 char가 알파벳이 아니라면
        if not char.isalpha():
            # for문 실행을 계속하고
            continue
     # arr_index라는 변수에 char의 아스키코드값에서 'a'의 아스키 코드값을 빼서 저장한다.
        arr_index = ord(char) - ord('a')
        # 이 때, alphabet_occurrence_array의 해당 인덱스에 1을 추가한다.
        alphabet_occurrence_array[arr_index] += 1

    # 최대빈도수(max_occurrence)와 최대빈도수인 알파벳의 인덱스를 0으로 설정하고
    max_occurrence = 0
    max_alphabet_index = 0
    # index in range(len()) : 숫자 배열을 사용하고 range()를 사용하여 for 루프 내부에서 배열을 반복하는 방법
    for index in range(len(alphabet_occurrence_array)):
        # index 0 -> alpha_occurrence 
        alphabet_occurrence = alphabet_occurrence_array[index]

        if alphabet_occurrence > max_occurrence:
            max_alphabet_index = index
            max_occurrence = alphabet_occurrence

    return chr(max_alphabet_index + ord("a"))


result = find_max_occurred_alphabet(input)
print(result)

오늘 처음 알고리즘을 배웠는데, 문제도 아직 이해하기에는 생각하는 연습이 좀 부족한 것 같다. 앞으로 여러가지 문제 풀어보면서 알고리즘에 대해 생각하는 연습을 해봐야겠다 !
화이팅...!!

profile
코딩은 짜릿해 늘 새로워 ✨

1개의 댓글

comment-user-thumbnail
2022년 11월 10일

사고력을 기르는게 쉽지 않더라구요
반본적으로 생각하는 훈련이 제일 좋습니다 화이팅!

답글 달기