스파르타코딩 - 알고리즘 강의 1 주차

코일·2021년 11월 11일
0
post-thumbnail

강의

1주차 - 21. 11. 08

내용

  • 최대값 찾기 이해
    def find_max_num(array):
    
        max_num = array[0] # 비교할 대상 ( pivot )
        for i in array:
            if i > max_num: # 더 큰값을 Max_num 으로 넘김
                max_num = i
    
        return max_num 
    
    print("solutaion = 6 / result = ", find_max_num([3, 5, 6, 1, 2, 4]))
    print("solutaion = 6 / result = ", find_max_num([6, 6, 6]))
    print("solutaion = 1888 / result = ", find_max_num([6, 9, 2, 7, 1888]))
  • 최빈값 찾기 이해
    def find_alphabet_occurrence_array(string):
        alphabet_occurrence_array = [0] * 26 # 알파벳 개수인 26을 배열로 생성
    
        for char in string:
            if not char.isalpha(): # 알파벳이 아니면 계속 진행해라 
                continue
            arr_index = ord(char) - ord('a') # ASCII 코드 사용 글자를 숫자로 바꿔줌
    				# 그 숫자를 인덱스로 넣어주고, 나타날때마다 + 1 해준다 ( 최고 빈도 만듬 )
            alphabet_occurrence_array[arr_index] += 1 
    
        max_occurrence = 0 # 최빈값을 담을 그릇
        max_index = 0 # 최빈값의 인덱스를 담을 그릇
        for index in range(len(alphabet_occurrence_array)):
            alphabet_occurrence = alphabet_occurrence_array[index]
            if max_occurrence < alphabet_occurrence: # 더 큰 값을 max_occurrence 로 넘김
                max_occurrence = alphabet_occurrence
                max_index = index # 그 값의 인덱스가 최대값의 인덱스임
    
        return chr(max_index + ord('a')) # 그 최대값을 글자로 변환해주자.
    
    result = find_alphabet_occurrence_array
    print("정답 = a 현재 풀이 값 =", result("Hello my name is sparta"))
    print("정답 = a 현재 풀이 값 =", result("Sparta coding club"))
    print("정답 = s 현재 풀이 값 =", result("best of best sparta"))
  • 곱하기 또는 더하기 이해
    def find_max_plus_or_multiply(array):
    
        num = 0 # 결과값
        for i in array:
            if i <= 1 or num <= 1: # array 의 값 or 결과값의 초기값 이 0, 1 일때
                num += i # 더하고
            else:
                num *= i # 나머진 곱한다.
    
        return num
    
    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]))
  • 최저 빈도 수의 알파벳
    def find_not_repeating_first_character(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
    
        not_repeat = [] # 최저 빈도를 담을 그릇
        for index in range(len(alphabet_occurrence_array)):
            if alphabet_occurrence_array[index] == 1: # 1이면
                not_repeat.append(chr(index + ord('a'))) # 알파벳으로 담는다
    
    		# 여기까지의 결과는 [c, d] 라고 나온다 순서를 위해 여기서 한번 더 for 문 해야한다.
    
        for char in string:
            if char in not_repeat: # not_repeat에 char 가 있으면,
                return char
    
        return '_'
    
    result = find_not_repeating_first_character
    print("정답 = d 현재 풀이 값 =", result("abadabac"))
    print("정답 = c 현재 풀이 값 =", result("aabbcddd"))
    print("정답 =_ 현재 풀이 값 =", result("aaaaaaaa"))
  • HW. 소수 나열하기
    input = 20
    
    def find_prime_list_under_number(number):
    
        prime_num = [] # 결과값 그릇
        for n in range(2, number + 1): # 소수 1 을 제외하고, 입력값 보다 1 큰 수 까지
    				# for i in range(2, n): -> 기존: 2 부터 n 까지
            for i in prime_num: # 모든 소수 로 나누어 떨어지지 않는지 알아보도록 개선 (2, 3)
                if n % i == 0 and i * i <= n :
                    break
            else:
                prime_num.append(n)
    
        return prime_num
    
    result = find_prime_list_under_number(input)
    print(result)
  • HW. 문자열 뒤집기
    input = "011110"
    
    def find_count_to_turn_out_to_all_zero_or_all_one(string):
        turn_zero = 0
        turn_one = 0
    
        if string[0] == '0':
            turn_zero += 1
        elif string[0] == '1':
            turn_one += 1
    
        for i in range(len(string) -1):
            if string[i] != string[i + 1]:
                if string[i + 1] == '0':
                    turn_zero += 1
                if string[i + 1] == '1':
                    turn_one += 1
    
        return min(turn_zero,turn_one)
    
    result = find_count_to_turn_out_to_all_zero_or_all_one(input)
    print(result)

궁금증 ?

  • 최대값 찾기 이해 ( ft. for - else )
    def find_max_num(array):
    
        for i in array:
            for ii in array:
                if i < ii :
                    break
            else:
                return i
    
    print("solutaion = 6 / result = ", find_max_num([3, 5, 6, 1, 2, 4]))
    print("solutaion = 6 / result = ", find_max_num([6, 6, 6]))
    print("solutaion = 1888 / result = ", find_max_num([6, 9, 2, 7, 1888]))
    Q ) 왜 else 의 위치가 저렇게 되는지?
    • for - else 문을 이해하자 파이썬에는 for문에 특이한 else기능이 하나 더 있습니다. 이것은 일종의 syntax sugar같은 것인데, 이런 문법들을 사용하면, 간결해지면서 가독성이 좋아지죠,, (단 문법을 알고 있다는 전제로 입니다. ) 이 방법의 사용예는 for문을 사용하다보면, 루프 중간에 break 문으로 빠져나오는 경우들이 있는데, 이게 break문이 걸려서 빠져나가는지 아닌지를 판단이 필요한 경우가 있습니다. 보통은  flag등을 둬서, 처리하는게 기존의 방식이라면, for문과 같은 레벨에 else를 둬서 break없이 빠져나온 경우를 처리하는 방법입니다.
      for x in range(4):
      	if x == 2:
      		print ('loop out')
      		break
      else:
      	print ('loop end')
      위 예제의 경우는 x =2 에서 루프를 빠져나오기때문에, else문이 실행이 되지 않고 'loop out' 이 출력이 되고,
      for x in range(4):
        # nop
      	pass
      else:
      	print ('loop end')
      위와 같은 경우는 , for loop가 break없이 빠져나왔으므로 'loop end' 가 출력이 된다. ref. http://pyengine.blogspot.com/2019/12/for-else.html
profile
How do you get what you want?🤔🤔

0개의 댓글