[TIL] Day 09 코딩테스트 기초부터 탄탄히
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 문법 강의>
하루를 마치며
코딩테스트에 이리 치이고 저리 치였다.
흠씬 맞으면서 느꼈다.
그래도 해볼 만한데?!
계속 부딪쳐서 맷집을 키우고 힘을 길러야겠다.
오늘의 한 줄
부단히 나아가자!