[스파르타 _ 리액트 과정] 8일차

et Ji·2022년 11월 9일
0

TIL

목록 보기
13/40

📜 진행 내용

  • [자습] 프로그래머스 코딩 테스트
  • [강의수강] 파이썬 문법 기초 1-16~18 (완강)
  • [강의수강] 알고리즘 실시간 강의
  • [강의수강] 자료구조, 알고리즘

💡 배운내용

< 알고리즘 실시간 강의 >

  • 공부하는 법

    • 자신있는 주언어를 하나 정해서 연습하라.
      ※ 실제 코테에서 파이썬, 자바스크립트, C++ 제일 많이 쓴다.
      파이썬은 프로그램을 돌릴 때 실행하는 시간의 제약이 없다.

    • 어떤 데이터 타입이나, 메서드 등을 볼 때, 순서보장이 되는지 등을 '기억'하려 한다기보다, '왜' 그런지를 파고들 것.

    • 애매하게 이해하는 것이 더 위험하다. 확실히 짚고 넘어가라.

  • 코딩 테스트 준비에 앞서

    • 알고리즘이 강점이 된다면, 문제를 쉽고 빠르게, 간결하게 푸는 것이 풀어나갈 확률이 높다.
      프로그램의 본질과도 직결되는 부분!

    • 실제 코딩 테스트에서는 라이브러리 등 없이 코딩을 하게 된다.
      기본 테크닉을 익히는 데 중점 두기!
      '자주 쓰는 함수/문법은 암기하자'


< 프로그래머스 0단계 >

배열 자르기

> 나의 풀이 (splice) >> 원본을 바꿔서 통과 안됨.

const solution = function (numbers, num1, num2) {
    let answer = [];
    answer = numbers.splice(num1, num2);
    return answer;
  };

  console.log(solution([1, 2, 3, 4, 5], 1, 3));

> 나의 풀이 2 (slice)

const solution = function (numbers, num1, num2) {
    return numbers.slice(num1, num2 + 1);
  };

  console.log(solution([1, 2, 3, 4, 5], 1, 3));

> 다른 풀이

function solution(numbers, num1, num2) {
    let answer = [];

    for (let i = num1; i < num2 + 1; i++) {
      answer.push(numbers[i]);
    }

    return answer;
  }

> 다른 풀이 2

function solution(numbers, num1, num2) {
    return numbers.filter((n, i) => num1 <= i && i <= num2);
  }

  console.log(solution([1, 2, 3, 4, 5], 1, 3));

점의 위치 구하기

> 나의 풀이 ( if )

function solution(dot) {
    const x = dot[0];
    const y = dot[1];
    let answer = 0;

    if (x > 0 && y > 0) {
      answer = 1;
    } else if (x < 0 && y > 0) {
      answer = 2;
    } else if (x < 0 && y < 0) {
      answer = 3;
    } else {
      answer = 4;
    }

    return answer;
  }
  console.log(solution([2, 4]));
  console.log(solution([-7, 9]));

> 다른 풀이

function solution(dot) {
    const [num,num2] = dot;
    const check = num * num2 > 0;
    return num > 0 ? (check ? 1 : 4) : (check ? 3 : 2);
}

< 파이썬 문법 기초 >

1-16. map, filter, lambda식

  • 리스트의 모든 원소 조작하기 : map
    • map을 실행한 값을 출력할 시 왜 list로 감싸야 될까?

    • people = [
          {'name': 'bob', 'age': 20},
          {'name': 'carry', 'age': 38},
          {'name': 'john', 'age': 7},
          {'name': 'smith', 'age': 17},
          {'name': 'ben', 'age': 27},
          {'name': 'bobby', 'age': 57},
          {'name': 'red', 'age': 32},
          {'name': 'queen', 'age': 25}
      ]
      
      def check_adult(person):
          if person['age'] > 20:
              return '성인'
          else:
              return '청소년'
      
      result = map(check_adult, people)
      print(list(result))
      
      # ['청소년', '성인', '청소년', '청소년', '성인', '성인', '성인', '성인']
  • 익명 함수를 한 줄에 표현해주기 : lambda
    • lambda 매개변수: (조건), 리스트명
    • 보통 매개변수는 x로 써준다.
      • 함수의 실행 코드 한 줄로 써보기.
        def check_adult(person):
            return '성인' if person['age'] > 20 else '청소년'
        
        result = map(check_adult, people)
        print(list(result))
      • 줄여 쓴 실행 코드를 map()과 같이 써보기
        • 따로 함수를 만들지 않아도 된다.

          result = map(lambda person: ('성인' if person['age'] > 20 else '청소년'), people)
      • filter()와 같이 써보기
        result = filter(lambda person: person['age'] > 20, people)
      • 매개변수를 x로 써주기
        result = filter(lambda x: x['age'] > 20, people)
  • 리스트 요소 중 True인 요소만 가져오기 : filter
    def check_adult(person):
        return person['age'] > 20
    
    result = filter(check_adult, people)
    print(list(result))

1-17. 함수 심화

  • 함수의 매개변수
    • 직접 쓰는 것보단, 라이브러리를 가져와 사용할 때나 라이브러리가 어떻게 생겼는지 파악할 때 활용할 수 있다.
      • 함수의 매개변수는 직접 지정할 수 있고, 지정 시 순서를 안 맞춰줘도 된다.
        def cal(a, b):
            return a+2*b
        
        result = cal(1, 2)
        
        # 매개변수값을 지정할 수 있다.
        result = cal(a=1, b=2)
        
        # 지정하면, 순서를 안맞춰줘도 된다.
        result = cal(b=2, a=1)
        
        print(result)
      • 입력 값의 개수를 무제한으로 받기 : *args
        def cal3(*args):
            for name in args:
                print(f'{name} 밥먹어라~')
                
        cal3('영수', '철수', '영희')
      • 입력 값을 딕셔너리형으로 만들어주기 : **kwargs
        def cal4(**kwargs):
            print(kwargs)
        
        cal4(name='bob', age=30, height=180)
        # {'name': 'bob', 'age': 30, 'height': 180}

1-18. 클래스

  • 언제 사용할까?
    • 같은 속성을 가진 여러 개의 딕셔너리를 만들어야 할 때?

    • 예를 들어, 많은 몬스터의 HP를 관리해야한다고 하면, 클래스를 이용해서 속성을 한 군데에서 관리해 줄 수 있다.

    • 이때 클래스를 이용해 만들어낸 딕셔너리를 인스턴스라고 한다.

      class Monster():
          hp = 100
          alive = True
      
          def damage(self, attack):
              self.hp = self.hp - attack
              if self.hp < 0:
                  self.alive = False
      
          def status_check(self):
              if self.alive == True:
                  print('살았다')
              else:
                  print('죽었다!')
      
      # m1을 인스턴스다 라고 부른다. 예를 들어 여기에선 몬스터 한 마리다 라고 생각하면 쉽다.
      
      m1 = Monster()
      m1.damage(150)
      m1.status_check()
      
      m2 = Monster()
      m2.damage(90)
      m2.status_check()

< 자료구조, 알고리즘 >

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

✍️ 최댓값 찾기

Q. 다음과 같이 숫자로 이루어진 배열이 있을 때, 이 배열 내에서 가장 큰 수를 반환하시오.

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

# 나의 풀이
def find_max_num(array):
    max_num = 0;
    # 이 부분을 채워보세요!
    for num in array:
        if int(num) > max_num:
            max_num = num
    return max_num

# 강의 풀이

def find_max_num(array):
    for num in array:
        for compare_num in array:
            if num < compare_num:
                break
        else:
            return num

# 강의 풀이 2

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

  return max_num

result = find_max_num(input)
print(result)
  • 문제 풀이 방법 사이에서 어떤 게 더 효율적일까 생각해보기.

1-5. 알고리즘과 친해지기 (2)

✍️ 최빈값 찾기

Q. 다음과 같은 문자열을 입력받았을 때, 어떤 알파벳이 가장 많이 포함되어 있는지 반환하시오

  • TIP
    • 해당 문자열이 알파벳인지 확인 : str.isalpha()
    • 아스키 값 받아오기 : ord()
      print(ord('a'))               # 97 ('a'의 아스키값)
      print(ord('a') - ord('a'))    # 97-97 -> 0
      print(ord('b') - ord('a'))    # 98-97 -> 1
  • 알파벳의 빈도수 세기
    def find_alphabet_occurrence_array(string):
      alphabet_occurrence_array = [0] * 26
     
      for str in string:
        if not str.isalpha():
          continue
        arr_index = ord(str) - ord("a")
        alphabet_occurrence_array[arr_index] += 1
    
      return alphabet_occurrence_array
    
    print(find_alphabet_occurrence_array("hello my name is sparta"))
    
  • 풀이
    input = "hello my name is sparta"
    
    # 나의 풀이
    def find_max_occurred_alphabet(string):
        alphabet_occurrence_array = [0] * 26
    
        for str in string:
            if not str.isalpha():
                continue
            arr_index = ord(str) - ord("a")
            alphabet_occurrence_array[arr_index] += 1
            count = alphabet_occurrence_array[0]
            for num in alphabet_occurrence_array:
                if num > count:
                    count = num
            max_index = alphabet_occurrence_array[count] + ord("a")
        return chr(max_index)
    
    result = find_max_occurred_alphabet(input)
    print(result)
    
    #  강의 풀이
    def find_max_occurred_alphabet(string):
        alphabet_occurence_array = [0] * 26
    
        for char in string:
            if not char.isalpha():
                continue
            arr_index = ord(char) - ord('a')
            alphabet_occurence_array[arr_index] += 1
    
        max_occurence = 0
        max_alphabet_index = 0
        # 가장 큰값의 인덱스 구하기
        for index in range(len(alphabet_occurence_array)):
        ## range함수는 특정 구간의 숫자의 범위를 만들어주는 함수
            # print(index)
            # index 0 -> alphabet_occurrence 3
            alphabet_occurrence = alphabet_occurence_array[index]
            if alphabet_occurrence > max_occurence:
                max_occurence = alphabet_occurrence
                max_alphabet_index = index
    
            return chr(max_alphabet_index + ord('a'))
    
    result = find_max_occurred_alphabet(input)
    print(result)

⁉️ 어려웠던 내용

  • 알고리즘 강의가 파이썬으로 진행되어서, 파이썬 강의를 일단 먼저 다 들었다. 파이썬은 아직 개념을 익힌 정도라, 알고리즘 강의에서 문제를 내주면 파이썬으로 풀어보려는데 시간이 더 오래 걸린다. 내일부터는 최대한 알고리즘 개념 중심으로 이해하고, 파이썬으로 푸는데 오래 걸린다면 자바스크립트로 풀어야겠다.

❎ 한 번 더 공부할 내용

  • 자료구조,알고리즘 1-6 시간 복잡도 부분.

🔗 출처

  • 스파르타코딩클럽 - 파이썬 문법 기초 강의
  • 스파르타코딩클럽 - 자료구조, 알고리즘 강의
profile
codesign

0개의 댓글