카테고리 없음

[TIL] Day 09 코딩테스트 기초부터 탄탄히

y.developer 2023. 10. 17. 19:29
728x90

2023.10.17 화

 

<09:00~11:00 알고리즘 특강 2>

적절한 상황에 안 맞는 알고리즘에 따라 코드 효율성이 달라진다.

그렇기 때문에 알고리즘 지식을 알고 있어야 한다.

 

기본 자료구조, 시간복잡도 및 Big O(빅오) 표기법, 기본 정렬 알고리즘에 대해서 배웠다.

생각보다 더 어려웠다.

 

 

자료구조

배열은 프로그래밍을 할 때 가장 자연스럽게 많이 쓰는 자료구조

연관된 데이터를 하나의 변수에 그룹핑해서 관리하는 게 핵심!

 

실제로 배열을 생성하면 메모리에 연속적인 위치에 존재를 하여 하나의 변수에 여러 정보를 담을 수 있고,

반복문과 결합하면 많은 정보도 효율적으로 처리할 수 있다.

 

값을 빠르게 갖고 오는 것이 장점이다.

데이터를 빈번하게 접근해야 될 때 사용!

 

배열에서 할 수 있는 대표적인 기능

 

  • 조회
  • 삽입 & 삭제
  • 정렬
  • 검색

 

Big O notation(빅오 표기법)

알고리즘의 효율성을 표현하는 방법으로, 특히 탐색 또는 분류 알고리즘의 수행 능력을 평가하는 척도이다.

알고리즘이나 함수의 시간 복잡도(time complexity)나 공간 복잡도(space complexity)를 표기하는 방법 중 하나.

 

시간 복잡도란 입력 데이터 크기에 대해 알고리즘이나 함수가 동작하는 데 걸리는 시간의 측정이다.

이를 표기할 때 빅오 표기법은 최악의 경우를 가정하여 알고리즘이나 함수의 시간 복잡도 상한을 표기한다.

 

 

링크드리스트

유동적으로 연결고리를 떼었다가 붙였다가 할 수 있는 자료구조

train_compartments = ["기관실"] -> ["시멘트"] -> ["자갈"] -> ["밀가루"] -> ["우편"]

# 처음 상태 ["기관실"] -> ["시멘트"] -> ["자갈"] -> ["밀가루"] -> ["우편"]
                                            ["흑연"] 을 중간에 넣어야 합니다

# 1. 자갈 칸의 연결고리를 흑연 칸으로 연결하고,
["자갈"] -> ["흑연"]  ["밀가루"] -> ["우편"]

# 2. 흑연 칸으로 연결고리를 밀가루 칸으로 연결합니다.
["자갈"] -> ["흑연"] -> ["밀가루"] -> ["우편"]

노드

위의 예제에서 각 화물 칸들을 나타낸다.

맨 앞의 노드를 Head, 맨 뒤의 노드(포인터가 NULL)를 Tail이라고 한다.

 

포인터

현재 노드가 가리키는 다음 화물 칸을 나타낸다.

 

배열이 값을 빠르게 갖고 오는 것이 장점이라면,

링크드리스트는 원소의 삽입 & 삭제에 강점이 있는 자료 구조

데이터를 빈번하게 삽입/삭제해야 될 때 사용!

 

 

정렬 알고리즘 - 버블 정렬

첫 번째 자료와 두 번째 자료를, 두 번째 자료와 세 번째 자료를, 세 번째와 네 번째를, …

이런 식으로 (마지막-1)번째 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬하는 방식.

작은 숫자, 큰 숫자 순서로 있으면 내버려 두고 큰 숫자, 작은 숫자 순서로 있으면 둘의 위치를 변경한다.

시간 복잡도는 O(N^2)

 

 

 

정렬 알고리즘 - 선택 정렬

index 하나마다 위치할 원소를 결정하고 그다음 index로 넘어가는 기법

예를 들어 사람들이 일렬로 쭉~ 서 있는데, 한번 쓱 둘러보면서 가장 키 작은 사람을 찾는 것이다.

그리고 전부 다 봤다면, 그중 가장 키 작은 사람! 맨 앞으로 와!

그다음에 또 둘러보면서 두 번째로 키 작은 사람을 두 번째에 배치시킨다.

시간 복잡도는 O(N^2)

다른 알고리즘 종류들

 

  • 삽입 정렬
  • 머지 정렬
  • 힙 정렬
  • 퀵 정렬
  • 셀 정렬
  • 기수 정렬

 

다른 자료구조 종류들

 

  • 스택
  • 트리
  • 트라이
  • 그래프
  • 해시 테이블

이 밖에 재귀, DP(다이나믹 프로그래밍), 탐욕 알고리즘, 근사 알고리즘, 메모이제이션, 휴리스틱 등등 (와 진짜 많네) 친해져야 될 개념들이 많다!

 

본격적인 공부를 하기 전에 꼭 알았으면 하는 것이 있다.

알고리즘을 많이 알고 잘한다는 것이 꼭 좋은 개발자를 나타내는 것은 아니다.

좋은 개발이란 모르는 것을 어떤 방법으로 접근해서 풀까? 라는 문제해결력이 더 중요하다고 생각한다.

알고리즘은 문제 해결 접근방법에 대해 조금 더 쉽게 생각할 수 있게 해주는 도구라고 생각하면 되겠다.

 

 

<11:00 코딩테스트 - 프로그래머스>

코딩 기초 트레이닝 캘린더

매일 추천 문제가 주어지고, 문제를 해결하면 스탬프가 찍힌다.

비록 LV0 문제이지만, 기초부터 매일 5문제씩 풀어보려고 한다.

어찌 보면 자존감 올리기 프로젝트일지도? 😉

 

코딩테스트를 처음 접해보는데 막막해 보여도 계속해서 생각하고 명령어들을 찾아가며 고민하다 보면 풀린다.

그리고 중요한 것은 다른 사람들의 해결법과 비교해 보는 것!

분명 더 효율적이고 깔끔한 코드가 있을 것이다.

내 코드가 그렇게 될 때까지 연습하고 또 연습하자.

 

 

<12:00 JS 문법 강의>

내일 있을 개인과제 발제까지 문법 강의를 다 듣는 것이 목표다.

오늘은 하루 종일 강의를 듣고 이해하는 것에 집중해야겠다.

 

 

<19:00~19:30 TIL 특강>

지금 작성하고 있는 TIL에 대한 특강이다.

솔직히 이렇게 작성하는 것이 맞는지 의문이 들었다.

그에 대한 특강을 들으니 많은 도움이 되었다.

 

완벽하지 않아도 된다.

정해진 정답은 없다.

 

중요한 것은 하루에 한 번 어떤 주제든 작성하는 것!

비록 쓰고 있는 글이 똥 같아도 예쁘게 써보자 ㅋㅋㅋㅋㅋ

기록하고, 성장하고, 활용하자

 

주제 정하기

어떤 주제든 상관없다.

오늘 배우고 느낀 것을 솔직하게 작성하자!

 

  • 강의 내용 정리
  • 개발, 프로젝트 설정 등 단계 정리
  • 하루 회고
  • 문제 해결 과정

 

<19:30 JS 문법 강의>

 

 


하루를 마치며

코딩테스트에 이리 치이고 저리 치였다.

흠씬 맞으면서 느꼈다.

그래도 해볼 만한데?!

계속 부딪쳐서 맷집을 키우고 힘을 길러야겠다.

 

 

오늘의 한 줄
부단히 나아가자!

 

728x90