[11.08] 내일배움캠프[Spring] TIL-7

박상훈·2022년 11월 8일
0

내일배움캠프[TIL]

목록 보기
7/72

[11.08] 내일배움캠프[Spring] TIL-7

1.다시보는 python기초

ext = 'sanghoon'

* text[0:3] -> 앞에서 3번째 까지 자르기
* split('') -> 괄호 기준으로 잘라서 배열 담기
* a_list = ['사과','참외','메론'] 
-> a_lsit[-1] = 가장 마지막 값
-> a_list.sort() = 오름 차순 정렬
-> result = ('사과' in a_list) = True

* dict 자료형
a_dict = {'name':'bob','age':27}
a_dict['height'] = 180 // 추가

print(a_dict) # height : 180 추가된 dict 자료형 출력

* list + dict 형태
people = [{'name':'bob','age':27},
          {'name':'john','age':30}]

print(people[0]['name']) # bob
  • for문에서 enumerate
for i,person in enumerate(people):
    age = person['age']
    name = person['name']

    print(i,name,age) -> 배열방에서 index처럼 0~길이 -1 만큼 순서가 부여된다!!!
  • 주민번호 홀수 = 남자 , 짝수 = 여자 판별 예제
def check_gender(num):
    num_check = int(num.split('-')[1][0:1])

    if num_check % 2 == 1:
        print("남자입니다.")
        print(num_check)


    else:
        print("여자입니다.")
        print(num_check)


check_gender("150101-1012345")
check_gender("150101-2012345")
check_gender("150101-4012345")

2. 파이썬 알고리즘(개념)

  • 시간 복잡도
    👉 입력값과 문제를 해결하는 데 걸리는 시간과의 상관관계
    👉 각 줄이 실행되는 것을 1번이라고 생각
  • 예시로 계산하는 시간 복잡도
input = [3, 5, 6, 1, 2, 4]

* 최대값 찾기 예제로 보는 시간 복잡도
def find_max_num(array) 
    for j in array: # array의 길이만큼 아래 연산이 실행
        for compare in array: # array의 길이만큼 아래 연산이 실행
            if j < compare: # 비교 연산 1번 실행
                break
        else:
           return j

👉 Array의 길이 + Array의 길이 + 비교연산 1번
👉 여기서 array(입력값)의 길이는 보통 N이라고 칭한다.
👉 따라서 N^2 만큼의 시간이 걸렸구나! 라고 생각할 수 있다.
👉 입력 값?? -> 함수에서 크기가 변경될 수 있는 값!!!
👉 N의 수식으로 표현할 것

⭐ 중요사항 : 상수는 생각하지 않고, N만 신경쓸 것!!
👉 ex) 2N+1의 시간 복잡도라면 N의 시간 복잡도라고 생각해도 무관!

  • 공간 복잡도
    👉 입력값과 문제를 해결하는 데 걸리는 공간과의 상관관계를 말한다.
    👉 간단하게 얘기하면 데이터를 할당하는 크기!!
  • 예시로 계산하는 공간 복잡도
* 공간 복잡도 최빈값으로 살펴보기(첫번 째 예제)

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:
        occurrence = 0
        for char in string:
            if char == alphabet:
                occurrence += 1

        if occurrence > max_occurrence:
            max_alphabet = alphabet
            max_occurrence = occurrence

    return max_alphabet


result = find_max_occurred_alphabet
print("정답 = a 현재 풀이 값 =", result("Hello my name is sparta"))
print("정답 = a 현재 풀이 값 =", result("Sparta coding club"))
print("정답 = s 현재 풀이 값 =", result("best of best sparta"))

👉 alphabet_array의 길이 = 26 ,
max_occurrence , max_alphabet,occurence 변수 = 3 ->
total 29의 공간 복잡도가 사용

⭐ 공간 복잡도 -> 상수 = 크게 의미가 없다..
⭐ 따라서 공간 복잡도 보다는 시간 복잡도로 판별할 것!!

  • 점근 표기법
    👉 알고리즘의 성능을 수학적으로 평가하는 방법
    👉 빅 오 : 최악의 성능이 나올 때 까지 얼마나 걸릴지
    👉 빅 오메가 : 최고의 성능이 나올 때 까지 얼마나 걸릴지
  • 점근 표기법 배열 예제로 찾아보기
input = [3, 5, 6, 1, 2, 4]


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



result = is_number_exist(3, input)
print(result)

👉 운이 좋으면 한번만 연산해도 찾을 수 있다. -> 빅 오메가
👉 운이 좋지 않으면 끝까지 가야 찾을 수 있다. -> 빅 오

⭐ 이론 파트 요약
1) 입력값에 비례해서 얼마나 늘어날지 파악해보자!( ex 1 ? N ? N^2 )
2) 공간 복잡도 보다는 시간 복잡도를 더 줄이기 위해 고민하자!
3) 최악의 경우에 시간이 얼마나 소요될지(빅 오)에 대해 고민하자

3. 파이썬 알고리즘(예제)

👉input = [0, 3, 5, 6, 1, 2, 4] 을 왼쪽 부터 차례대로 곱하기와 더하기를 하여 최대값을 구하시오( 수학에서의 사측연산 우선순위가 아닌 왼쪽부터의 연산 우선순위를 가진다. )

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

def find_max_plus_or_multiply(array):
    max_num = 0
    for find_num in array:
        if find_num <=1 or max_num <=1 :
            max_num+=find_num
        else:
            max_num*=find_num



    return max_num


result = find_max_plus_or_multiply(input)
print(result)

4. java 코딩테스트

👉 포켓몬 선택, 종류가 같으면 1종류로 친다.
👉 6마리의 포켓몬이 있다면 선택은 3마리만 가능(tot/2) 만큼 선택가능
👉 그렇게 선택할 때 최대로 선택할 수 있는 종류의 가짓수를 구해라!

import java.util.HashSet;

class Solution {

    public static void main(String[] args) {
        Solution sol = new Solution();
        int[] a = new int[]{1,2,3,4,5,6};
        sol.solution(a);
    }


    public int solution(int[] nums) {

        int n = nums.length/2;
        HashSet<Integer> arr = new HashSet<Integer>();

        for(int i =0;i<nums.length;i++){

            if(arr.size()>=n){
                break;
            }else{
                arr.add(nums[i]);
            }

        }
        System.out.println(arr);
        System.out.println(arr.size());


        return 1;
    }
}

5. 느낀점⭐

1) 너무 어렵게 생각하지 말자...
2) 꾸준하게 1문제씩 풀자...

profile
기록하는 습관

0개의 댓글