개발자 되는 중/개발 공부

스파르타 알고리즘 - Python 1주차

SeonChoco 2022. 12. 14. 21:21

01. 오늘 배울 것

알고리즘이란

어떤 문제가 있을 때 그것을 해결하기 위한 여러 동작의 모임이다

문제를 해결하는 가장 효율적인 방법을 찾으려 한다

 

알고리즘을 공부하는 이유

1. 좋은 개발자 되려고

좋은개발자가 되려면 좋은 프로그램을 구현할 줄 알아야한다. 

특정 자료구조나 접근방법을 사용하면 좋은 프로그램을 만들 수 있다.

이건 배워야 할 수 있는 거다. 개발과는 별개

2. 좋은 회사 취직하려고 

코딩테스트를 통과하려고

이번 강의를 다 들으면 충분히 해결할 수 있을 것

하지만 취업하고 나서는 만들어진거 가져다 쓴다

 

1~5주차 배울것

1. 시간/공간 복잡도/ 알고리즘 구현력기르기

2.어레이, 링크드 리스트(코딩테스트 단골주제)/ 이분탐색, 재귀 

3.정렬, 스택, 큐, 해쉬

4. 힙, BFS, DFS, Dynamic Programming

5. 종합 알고리즘 문제풀이

 

03. 파이참으로 코딩하기

파이참에서 파일만들 때 그냥 파일 선택해주고 확장자?를 써주면 원하는 형식의 파일을 만들 수 있다.

컴퓨터는 특수 문자 싫어한다. 띄어쓰기도 특수문자에 해당한다. 그래서 _ 언더바로 표시함.

경로란 폴더이다

경로 만들기 = 폴더 만들기

04. 알고리즘과 친해지기 (1)

최댓값 찾기

def find_max_num(array):
    return max(array)


print("정답 = 6 / 현재 풀이 값 = ", find_max_num([3, 5, 6, 1, 2, 4]))
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([6, 6, 6]))
print("정답 = 1888 / 현재 풀이 값 = ", find_max_num([6, 9, 2, 7, 1888]))

이중반복문 구조로 구현하였다. break는 for 문을 빠져나온다 for else 구문을 이용해주었다. if else 아니다 

def find_max_num(array):
    for num in array:
        for compare_num in array:
            if num < compare_num:
                break
        else:
            return num #반복문 두개를 만들어서 모든 데이터들을 서로서로 비교할 수 있도록 한다

print("정답 = 6 / 현재 풀이 값 = ", find_max_num([3, 5, 6, 1, 2, 4]))
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([6, 6, 6]))
print("정답 = 1888 / 현재 풀이 값 = ", find_max_num([6, 9, 2, 7, 1888]))

else를 바깥의 if절에 놓지 않고 안쪽의 if절에 놓아서 원하는 결과가 나오지 않았었다.

# 강창민 튜터님의 특강에서 상세히 설명을 들었는데, num으로 뽑아준 데이터 하나에 compare num로 뽑아준 모든 데이터를 다 비교해본다. 그리고 num의 마지막 데이터까지 이 일을 반복한다. 그니까 6개 데이터에 6번씩 비교를 해주니까 

총 36 비교를 해주는 것

맞나?

 

#노란줄은 왜 나오나

PEP(파이썬 기본 포매팅 규칙)에 맞지 않아서 - 이쁘게 쓰기 위한 규칙

파란색 reformat file(파일형식 다시 지정) 눌러주면 고쳐진다. 

 

두번째 방법= max_value를 리스트 안의 데이터와 비교한다  return 들여쓰기를 얼마나 해야하는지 잘 몰라서 자꾸 틀린 답이 나왔다.

def find_max_num(array):
    max_num = array[0]
    for a in array:
       if a > max_num:
           max_num = a
    return max_num


print("정답 = 6 / 현재 풀이 값 = ", find_max_num([3, 5, 6, 1, 2, 4]))
print("정답 = 6 / 현재 풀이 값 = ", find_max_num([6, 6, 6]))
print("정답 = 1888 / 현재 풀이 값 = ", find_max_num([6, 9, 2, 7, 1888]))

두번째 방법이 더 효율적이다. 

컴퓨터가 비교를 덜 해도 결과가 나오기 때문이다.

 

뭔가 어렵다... 

 

05. 알고리즘과 친해지기 (2)

이건 더 어렵다... 알고리즘과 친해지는게 아니라 멀어지는 기분이 든다...

알파벳에서 아스키코드로

ord()

아스키코드에서 알파벳으로

chr()

 

def find_alphabet_occurrence_array(string):
    alphabet_occurrence_array = [0] * 26

    for char in string:
        if not char.isalpha():
            continue
        arr_index = ord(char) - ord('a')
        alphabet_occurrence_array[arr_index] += 1
    return alphabet_occurrence_array


print("정답 = [3, 1, 0, 0, 2, 0, 0, 0, 1, 0, 0, 2, 2, 1, 1, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 0] \n현재 풀이 값 =",
      find_alphabet_occurrence_array("Hello my name is sparta"))
print("정답 = [2, 1, 2, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0] \n현재 풀이 값 =",
      find_alphabet_occurrence_array("Sparta coding club"))
print("정답 = [2, 2, 0, 0, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 3, 3, 0, 0, 0, 0, 0, 0] \n현재 풀이 값 =",
      find_alphabet_occurrence_array("best of best sparta"))

# continue 키워드는 조건에 해당하는 것을 빼고 실행해준다.

if not char.isalpha():
    continue

이부분을

if char.isalpha():

이렇게 써주어도 같은 기능을 한다 그래서 왜 굳이 위처럼 썼는지 궁금했는데, 어떤 분이 같은 의문을 가지고 질문 하셨고 설명을 공유하셨다.

 

# if char.isalpha()로 작성하여도 동일하게 작동은 할 수 있으나, 필터링이라는 본질적인 목적에는 부합하지 않습니다.

필터링은 담지 않을 것들을 거르는 행위임으로 필터링의 본질적인 기능(언어적인 의미&기능적인 의미)에 맞게 사용해야 합니다.따라서 if not으로 '담지 않을 것'(해당 케이스에서는 " ")을 거르는 방향으로 설계하는 것이 필터링의 본질에 맞게 코드를 작성하는 것입니다.

 

가장 많이 나온 알파벳 구하기

내가 쓴 답

input = "hello my name is sparta"

occured_alphabet_array = [0]*26

def find_max_occurred_alphabet(string):
    for s in string:
        if not s.isalpha():
            continue
        arr_index = ord(s) - ord('a')
        occured_alphabet_array[arr_index] += 1
    return occured_alphabet_array


def find_max_num(array):
    max_num = array[0]
    for a in array:
       if a > max_num:
           max_num = a
    return max_num


o_list =find_max_occurred_alphabet(input)
result = find_max_num(o_list)
index = o_list.index(result)
print(chr(97 + index))

# index라는 내장함수를 써서 풀었는데, 알고리즘 공부할 때는 내장 함수 많이 안 써준다.

 

A1. 첫 번째 방법

 

각 알파벳마다 문자열을 돌면서 몇 글자 나왔는지 확인합니다. 만약 그 숫자가 저장한 알파벳 빈도 수보다 크다면, 그 값을 저장하고 제일 큰 알파벳으로 저장합니다. 이 과정을 반복하다보면 가장 많이 나왔던 알 파벳을 알 수 있습니다.

input = 'hello myname is seonhyeong'

def find_max_occured_alphabet (string):
    alphabet_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
                      "t", "u", "v", "x", "y", "z"]
    max_occurence  = 0
    max_alphabet = alphabet_array[0]

    for alphabet in alphabet_array:
        occurence = 0
        for char in string:
            if char == alphabet:
                occurence += 1

        if occurence > max_occurence:
            max_occurence = occurence
            max_alphabet = alphabet #occurence가 가장 커졌을 때 alphabet에 들어있던 알파벳을 max_alphabet으로 만들어줘
    return max_alphabet



result = find_max_occured_alphabet(input)

두번째 방법

각 알파벳의 빈도수를 alphabet_occurrence_list 라는 변수에 저장합니다. 그리고 각 문자열을 돌면서 해당 문자가 알파벳인지 확인하고, 알파벳을 인덱스 화 시켜 각 알파벳의 빈도수를 업데이트 합니다. 이후, 알파벳의 빈도수가 가장 높은 인덱스를 찾습니다.

range() 어떠한 숫자가 있으면 0부터 그 숫자까지 리스트로 만들어서 넣어주는 함수

len() 리스트의 값의 수를 세어주는 함수

input = 'hello myname is spartabbbbb'

def find_max_occured_alphabet (string):
    alphabet_occurrence_array = [0] * 26

    for char in string:
        if char.isalpha():
            arr_index = ord(char) - ord('a')
            alphabet_occurrence_array[arr_index] += 1


    max_occurence = 0
    max_alphabet_index = 0
    for index in range(len(alphabet_occurrence_array)):
        # index 0 -> alphabet_occurence 3
            alphabet_occurence = alphabet_occurrence_array[index]

            if alphabet_occurence > max_occurence:
                max_occurence = alphabet_occurence
                max_alphabet_index = index
                max_alphabet = chr(97 + index)

    return max_alphabet


result = find_max_occured_alphabet(input)
print(result)

 first one is more effective 


06. 시간 복잡도 판단하기

 

시간 복잡도란?

입력값과 문제를 해결하는데 덜리는 시간과의 상관관계

입력값이 2배로 늘어났을 때 걸리는 시간은 얼마나 늘어났나?

입력값이 늘어나도 시간이 덜 늘어나는 알고리즘이 좋은 알고리즘

 

최댓값 찾기 알고리즘의 시간 복잡도 판단해보기

첫번째 방법

def find_max_num(array):
    for num in array: #array의 길이만큼 아래 연산이 실행
        for compare_num in array: #array의 길이만큼 아래 연산이 실행
            if num < compare_num: #비교연산 1번 실행
                break
        else:
            return num 

입력값을 보통 N이라고 한다.

연산된 것을 계산해보면

N * N * 1 = N²

 

입력값은 크기가 변경될 수 있는 값이다.

답을 36 이렇게 말하면 되는게 아니라 상관관계를 수식으로 표현하는 것을 시간복잡도라고 한다. 

 

#지수 키보드로 치는 법 

ㅊ + 한자

 

두번째 방법

def find_max_num(array):
    max_num = array[0]  #대입 연산 1번
    for a in array:     #입력값 만큼 연산
       if a > max_num:  #비교 연산 1번
           max_num = a  #대입 연산 1번
    return max_num      #return은 연산에 해당 안된다?
                        #  2N + 1

1. N과 N²은 N이 커질 수록 더 큰 차이가 난다.

2. N의 지수를 먼저 비교하면 된다.

 

하지만 모든 코드를 매 실행단계로 몇번의 연산을 하는지 확인하는 것은 불가능

따라서 상수는 무시하고 N에 관련해서만 파악하면 된다

ex)

2N + 1 연산량은 N

5N² +128은 N²

 

07. 공간 복잡도 판단하기

시간 복잡도랑 거의 유사한데 

입력값과 문제해결하는데 걸리는 공간과의 상관관계이다.

입력값 늘어날 때 공간은 얼마나 늘어나는지?

 

최빈값 찾는 코드

저장하는 데이터의 양이 1개의 공간을 사용한다

def find_max_occurred_alphabet(string):
    alphabet_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z"]
    #26개 공간 사용
    max_occurrence = 0 # 1개 공간 사용
    max_alphabet = alphabet_array[0] #1개 공간 사용

    for alphabet in alphabet_array: #반복문 돌리면서 alphabet 새로 만들어 준거 아닌가? 
        occurrence = 0 # 1개 공간
        for char in string:
            if char == alphabet: #이미 있던 변수에 다른 값을 저장해주는 것이기 때문에 공간 차지는 않하는 듯
                occurrence += 1

        if occurrence > max_occurrence:
            max_alphabet = alphabet
            max_occurrence = occurrence

    return max_alphabet

1. alphabet array 길이 26

2. max_occurence, max_alphabet, occurence 변수 = 3

29만큼의 공간을 사용

 

두번째 방법

def find_max_occurred_alphabet(string):
    alphabet_occurrence_list = [0] * 26 # 배열의 개수만큼 공간 사용 26

    for char in string:
        if not char.isalpha():
            continue
        arr_index = ord(char) - ord('a') #arr_index 
        # 입력값 만큼 공간 사용하는게 아니라 arr_index라는 상자는 하나이므로 1
        alphabet_occurrence_list[arr_index] += 1

    max_occurrence = 0  # 공간사용 1
    max_alphabet_index = 0 # 공간 사용 1
    for index in range(len(alphabet_occurrence_list)):
        alphabet_occurrence = alphabet_occurrence_list[index] #공간 사용 1
        if alphabet_occurrence > max_occurrence:
            max_occurrence = alphabet_occurrence
            max_alphabet_index = index

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

1. alphabet array 배열 = 26

2. arr_id, max_occurrecne, max_alphabet_index, alphabet_occurence 변수 = 4

 

총 30만큼 공간 사용함

 

둘 다 상수랑 차이없는거나 마찬가지

알고리즘 성능에 아무런 영향을 안 미친다

시간복잡도에 신경쓰는게 더 중요하다. 

 

혼자 시간복잡도 이해해보쟈...

 

첫번재 방법 시간복잡도

def find_max_occurred_alphabet(string):
    alphabet_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "x", "y", "z"]
    max_occurrence = 0
    max_alphabet = alphabet_array[0]

    for alphabet in alphabet_array: #배열 연산 26번
        occurrence = 0 #대입 연산 1번
        for char in string: #배열 연산 입력값 만큼 N번
            if char == alphabet: #대입연산 1이 아니고 비교연산 같은지 다른지 비교!
                occurrence += 1 #대입 연산 1

        if occurrence > max_occurrence: #비교연산 1
            max_alphabet = alphabet #대입연산 1
            max_occurrence = occurrence # 대입연산 1

    return max_alphabet

1. alphabet array 길이 X 대입연산 1번

2.  alphabet array 길이 X 입력값 길이 X (비교연산 1 + 대입연산 1)

3. alphabet array 길이 (비교연산1 +대입연산 1+ 대입연산 1)

       26(1+ 2N + 3)  =  52N + 104

 

어디가 곱하기고 어디가 더하기지? for문안에 들어가서 같이 반복해주면 곱하기 사용

아래의 최대 알파벳 구하는 비교문은 안의 for문에서 occurence를 구해서 나와준 다음에 시작되는 거고, 

알파벳 당 빈도수를 비교해주는 것이기 때문에 26만 곱해주면된다.

 

두번째 방식 시간 복잡도

alphabet_occurrence_list = [0] * 26 #대입 연산 26번?

def find_max_occurred_alphabet(string):

    for char in string: #입력값 만큼 연산 N
        if not char.isalpha(): #비교 연산 1
            continue
        arr_index = ord(char) - ord('a') #arr_index #대입 연산 1
        alphabet_occurrence_list[arr_index] += 1 #대입 연산 1

    max_occurrence = 0  # 대입 연산 1
    max_alphabet_index = 0 # 대입 연산 1
    for index in range(len(alphabet_occurrence_list)): #알파벳 배열 인덱스 수 26번 연산
        alphabet_occurrence = alphabet_occurrence_list[index] #대입 연산 1
        if alphabet_occurrence > max_occurrence: #비교 연산 1
            max_occurrence = alphabet_occurrence #대입 연산 1
            max_alphabet_index = index # 대입 연산 1

    return chr(max_alphabet_index + ord('a')) #대입 연산 1

1. alphabet_occurence_list array 길이 (답보니까 이거는 포함이 안 되어 있다. 왜 그렇지? 기본적으로 함수의 시간복잡도를 구하는 것이니까 함수에 포함되지 않는 것은 계산하지 않는다.

2. string 길이 연산 N X (비교1 + 대입 1 +  대입 1)

3. 대입 1+ 대입 1

3. alphabet_occurence_list array 길이 X (대입 1 + 비교1 + 대입 1+ 대입 1+ 대입 1)

26 + (N * 2) + 2+ (26 *5) =  3N + 182

 

답이랑 좀 다르네 여튼 어떤 식인지는 알겠다.

 

52N +104 든 3N + 182든 N²에 비하면 아무것도 아니다.

공간복잡도보다는 시간 복잡도를 더 신경써야한다.

 

 

08. 점근 표기법

점근표기법이란?

알고리즘 성능을 수학적으로 표기하는 방법

알고리즘의 효율성을 평가하는 방법

시간 복잡도, 공간복잡도를 분석했던게 점근표기법의 일종이다.

 

Big - O 빅오 표기법 Big- Ω 표기법  

(연산량에 대한 표기니까 시간복잡도를 표현할 때 쓸 수 있다)

빅오 표기법: 최악의 성능이 나올 때 어느 정도 연산량이 걸릴 것인지

빅오메가 표기법: 최선의 성능이 나올 때 어느정도 연산량이 걸릴 것인지

 

ex) Ο(N), Ω(1) 의 시간복잡도를 가진 알고리즘이다

 

오메가 키보드로 치는 법

ㅎ + 한자

 

Q. 다음과 같은 숫자로 이루어진 배열이 있을 때, 이 배열 내에 특정 숫자가 존재한다면 True, 존재하지 않다면 False 를 반환하시오.

def is_number_exist(number, array):
    for arr in array:
        if number == arr:
            return True
       
    return False # 반복문 끝까지 돌 때까지 True가 아닐 경우 return false 해준다.
    


result = is_number_exist
print("정답 = True 현재 풀이 값 =", result(3,[3,5,6,1,2,4]))
print("정답 = Flase 현재 풀이 값 =", result(7,[6,6,6]))
print("정답 = True 현재 풀이 값 =", result(2,[6,9,2,7,1888]))

위의 코드는 True가 나오지 않으면 다음 값이 나오도록 반복문을 돌려주고 True가 나오지 않고 반복문이 끝나면 조건문 밖으로 나가서 False를 return 해준다.

아래 것은 내가 쓴 답인데 

def is_number_exist(number, array):
    for arr in array:
        if number == arr:
            return True
        else:
            return False

코드 실행 순서 설명해주는 페이지에 가서 보니까

반복문이 돌지를 않고 배열의 첫번째 값만 넣어주고 return 해버려서 틀린 답이 나왔다.

여윽시 코아가 이것도 틀리는데 저 위의 코드는 혼자 우째짤꼬

 

시간복잡도 

def is_number_exist(number, array):
    for arr in array: #배열 길이만큼 연산
        if number == arr: #비교 연산 1
            return True 
       
    return False # 반복문 끝까지 돌 때까지 True가 아닐 경우 return false 해준다.

시간 복잡도 N *1이다.

그러나 모든 상황에서 N번 연산하는 것이 아니다!

print("정답 = True 현재 풀이 값 =", result(3,[3,5,6,1,2,4]))

 

비교할 값이 3인데 리스트의 첫번째 값부터 3이 나와서 바로 True로 끝난다 .비교 연산 1번 한다

print("정답 = Flase 현재 풀이 값 =", result(7,[6,6,6]))

비교할 값이 7인데 리스트에 해당하는 값이 없어서 3번째까지 반복문 돌려서 비교 연산 3번 한다

print("정답 = True 현재 풀이 값 =", result(2,[6,9,2,7,1888]))

비교할 값이 2인데 3번째에 해당하는 값이 있어서 True로 return하고 끝난다. 비교 연산 3번 한다.

 

즉 운이 좋으면 1번만 연산하고도 끝나지만 운이 좋지 않으면 리스트의 길이 N만큼 다 연산을 해야한다.

운이 안 좋을 때 빅오 표기법 O(N)

운이 좋을 때 빅오메가 표기법 Ω(1)

 

알고리즘은 성능이 항상 동일한게 아니라 입력값에 따라서 성능이 변화할 수 있다.

 

그런데 왜! 우리는 최악의 경우인 빅오표기법만 계산해서 썼을까?

 

알고리즘에서는 거의 빅오 표기법 분석한다.

왜?

최선의 경우는 별로 없고, 최악을 경우도 대비해야하기 때문이다.

 

오늘 기억해야할 것

1.  입력값에 비례해서 얼마나 늘어날지 파악해보자  1? N? N²?

2. 공간 복잡도보다는 시간 복잡도 줄이기 위해 고민하자

3. 최악의 경우에 시간이 얼마나 소요될지 (빅오 표기법에)대해 고민하자

 

09. 알고리즘 더 풀어보기 (1)

곱하기 or 더하기

Q.

다음과 같이 0 혹은 양의 정수로만 이루어진 배열이 있을 때,

왼쪽부터 오른쪽으로 하나씩 모든 숫자를 확인하며 숫자 사이에 '✕' 혹은 '+' 연산자를 넣어

결과적으로 가장 큰 수를 구하는 프로그램을 작성하시오.

단, '+' 보다 '✕' 를 먼저 계산하는 일반적인 방식과는 달리, 모든 연산은 왼쪽에서 순서대로 이루어진다.

def find_max_plus_or_multiply(array):
    total = 0
    for element in array:
        if element <= 1 or total <= 1:
            total += element
        else:
            total *= element
    return total

result = find_max_plus_or_multiply
print("정답 = 728 현재 풀이 값 =", result([0,3,5,6,1,2,4]))
print("정답 = 8820 현재 풀이 값 =", result([3,2,1,5,9,7,4]))
print("정답 = 270 현재 풀이 값 =", result([1,1,1,3,3,2,5]))

약간씩 힌트를 얻어서 풀긴했으나 total이 0,1 인 경우에도 더해줘야한다는 조건문을 빼먹은거 말고는 거의 비슷하게 썼다.

이 함수의 시간 복잡도 구해보자

1. 대입연산 1

2.  array 길이 연산 N X ( 비교 연산 2번? +대입 연산 1번) (둘 중 하나만 선택해서 실행하니까)

정답 3N + 1

 

오잉 이렇게 구할 필요 없이 중요한 N의 지수만 확인하기 위해 반복문만 확인해준다

빅오 표기는 O(N)

 

10. 알고리즘 더 풀어보기 (2)

반복되지 않는 문자

Q. 다음과 같이 영어로 되어 있는 문자열이 있을 때, 이 문자열에서 반복되지 않는 첫번째 문자를 반환하시오. 만약 그런 문자가 없다면 _ 를 반환하시오.

 

1. 반복문으로 리스트에 있는 문자열들을 뽑아준다...

2. 그 담에 자기 빼고 다른 배열들과 비교했을 때 같은게 나오면 다음 값으로 넘어가고 계속 다르고 마지막 까지 다르면 결과로 뽑아준다. 

자기빼고 다른 배열을 어떻게 비교해? 나눈 그런거 몰루

input = "abadabac"

def find_not_repeating_first_character(string):
    alphabet_occurrence_array = [0] * 26

    for char in string:
        if char.isalpha():
            arr_index = ord(char) - ord('a')
            alphabet_occurrence_array[arr_index] += 1


    only_alphabet_array = []
    for index in range(len(alphabet_occurrence_array)):
        alphabet_occurence = alphabet_occurrence_array[index]

        if alphabet_occurence == 1:
            only_alphabet = chr(97 + index)
            only_alphabet_array.append(only_alphabet)

    for char in string:
        if char in only_alphabet_array:
            return char
    return "_"



result = find_not_repeating_first_character
print("정답 = d 현재 풀이 값 =", result("abadabac"))
print("정답 = c 현재 풀이 값 =", result("aabbcddd"))
print("정답 =_ 현재 풀이 값 =", result("aaaaaaaa"))

1.저번에 알파벳 개수만큼 배열의 숫자 증가 시켜주는 코드 써준다.

- 알파벳 갯수 리스트 다 0으로 설정

- 들어온 텍스트를 반복문 돌려서 뽑아주고 ord('a') - ord('문자하나') 써서 index에 해당하는 숫자를 뽑아준다.

-해당 배열에 인덱스를 이용해서 1씩 더해준다

2. 유일한 글자가 들어갈 배열 만드는 코드 쓴다

- 유일한 글자가 들어갈 빈 리스트 만든다

- 알파벳 개수가 들어간 배열을 len()과 range() 이용해서 인덱스를 뽑아준다

- 인덱스를 이용해 알파벳 개수를 가져 온다.

- 알파벳 개수가 1인 것을 찾아서 아스키 코드를 이용해 다시 문자로 바꾸고 리스트에 넣는다.

3. 유일한 알파벳  리스트를 다시 내가 넣은 텍스트랑 비교해서 첫번째 유일한 알파벳을 뽑는다.

들어온 텍스트의 문자들을 다시 한번 뽑아주고 만약 그 문자가 유일한 알파뱃 리스트에 포함되어 있다면

해당 문자를 return 한다. 해당 사항이 없으면 '_'으로 return 한다.

'개발자 되는 중 > 개발 공부' 카테고리의 다른 글

애자일 방법론 특강  (0) 2022.12.16
CS 특강 - CPU  (0) 2022.12.15
스파르타 리액트 입문  (0) 2022.12.14
스파르타 React 숙련  (0) 2022.12.14
스파르타 Python 기초  (0) 2022.12.14