HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
📝
학습 TIL
/
📝
3일 차 배운 것 정리 (1)
📝

3일 차 배운 것 정리 (1)

대주제
자료구조
작성완료
작성완료
전날 정리 노트 이동
다음 정리 노트 이동
주제
시간복잡도
배열과 객체
연결리스트
스택
날짜
Mar 23, 2022
자료구조와 알고리즘1. 자료구조와 알고리즘이 중요한 이유 1-a. 자료구조와 알고리즘이란 (d)1-b. 중요한 이유2. 자료구조의 종류 (완료)2-a. 자료구조 선택에 무엇은 고려해야하는가2-b. 자료구조의 종류3. 시간복잡도3-a. 우리는 프로그램의 성능을 정확히 알 수 있는가?4. 배열4-a. 배열이란5. 연결리스트5-a. 연결리스트란?6. 스택6-a. 스택이란6-b. 실습

자료구조와 알고리즘

1. 자료구조와 알고리즘이 중요한 이유

1-a. 자료구조와 알고리즘이란 (d)

💡
<프로그래밍 은 요리 이다.>
  • 재료선택 → 도구선택 → 레시피 → 요리완성
    • 재료는 데이터
    • 도구는 자료구조
    • 레시피는 알고리즘
    • 요리는 소프트웨어, 요리사는 개발자, 먹는사람은 사용자
자료구조란 메모리를 효율적으로 사용하며, 빠르고 안정적으로 데이터를 처리하는 것이 목표 상황에 따라 유용하게 사용될 수 있도록 특정구조를 이룸
  • 종류 - 스택, 큐, 그래프, 트리
 
알고리즘이란 특정 문제를 효율적이고, 빠르게 해결하는 것을 목표로 정해진 일련의 절차나 방법을 공식화하여 표현한 것
  • 종류 - 이진탐색, 최단거리, ...

1-b. 중요한 이유

실무에서 중요하게 생각하는 3가지
  • 기초 코딩 능력 - 코딩능력, 논리적사고, 문제해결능력
  • 전문 분야 지식 - 프론트,백엔드 분야별 특화지식, 깊이있고 최신트렌드에 대한 지식
  • 기본 CS 지식 - 운영체제, 네트워크. 컴퓨터공학지식, 예외사항 대처 가능
 
자료구조와 알고리즘은 기초코딩능력, 특히 문제해결력을 기르기 위해 공부가 필요하다.
  • 논리적 사고: 논리적으로 해결가능한 방법인지 판단
  • 전산화 능력: 사고한 것을 코드로 표현하는 능력
  • 엣지케이스 탐색

2. 자료구조의 종류 (완료)

2-a. 자료구조 선택에 무엇은 고려해야하는가

💡
자료구조는 일차원인 컴퓨터 메모리를 현실에 대응되도록 구조화한 것
  • 현실에서의 수행 프로세스 고려
    • 영화고르기 → 줄서기 → 좌석선택 → 비용지불
  • 소프트웨어에서 처리 프로세스
    • 영화를 검색 → 트라이 자료구조
    • 고객이 많은 경우 줄을 서야한다. → 큐(Queue)
    • 고객은 좌석을 선택할 수 있어야한다. → 해시태이블(HashTable)

2-b. 자료구조의 종류

단순구조 - 정수, 실수, 문자열, 논리
선형구조 - 배열, 연결리스트. 스택, 큐
한 원소 뒤에 하나의 원소만이 존재하여 나열된 형태
notion image
비선형구조 - 트리, 그래프
원소간 다대다 관계를 가지는 구조
notion image
완벽한 자료구조는 없다
  • 더 좋은 자료구조가 존재하는 것이 아니라 상황에 맞는 자료구조 사용이 필요하다.

3. 시간복잡도

3-a. 우리는 프로그램의 성능을 정확히 알 수 있는가?

고려해야할 사항
  • 입력크기, 하드웨어 성능, 운영체제 성능, 컴파일러 최적화, 비동기로직, ....
  • 고려사항이 많아 정확히 파악하는 것 불가능
빅오표기법
notion image
  • 선형시간 < 로그시간 < 선형시간 < 선형지수시간 < 2차시간 < 지수시간 < 팩토리얼시간
  • 빅오표기법의 상수와 계수가 없는 이유
    • 빅오표기법은 점근적 표기법을 따르기 때문에
      • notion image
    • 계수 법칙 : n이 무한에 가까울 수록 상수 k의 크기는 의미가 없다.
    • 합의 법칙: 빅오 끼리는 더해질 수 있다.
    • 곱의 법칙: 빅오 끼리는 곱해질 수 있다.
  • 실제 성능을 측정하는 방법
    • Date객체를 이용하여 시작과 끝시간 빼서 계산

4. 배열

4-a. 배열이란

배열은 연관된 데이터를 연속적인 형태로 표현한 자료구조 각 원소들은 순서대로 번호(index)를 가지게 된다.
배열의 특징
  • 고정된 크기를 가진다.
    • 일반적으로 동적으로 크기 증가 불가하지만 js와 같은 스크립트 언어는 동적으로 크기가 증감된다.
  • 탐색 시간: O(1)
    • index를 통해 바로 접근
  • 원소 삭제: O(n)
    • 원소 삭제 시, 해당 공간은 당겨지지 않고 비워지게 된다.
      삭제 후, 빈 공간을 당기며 순서를 맞추기 위해 O(n)이 소요됨
      notion image
  • 원소 추가: O(n)
    • 가장 끝 빈 공간부터 차례대로 당기며 추가 작업 진행하므로 O(n) 소요
      notion image
즉 배열은 원소의 탐색 시간에 비해 추가/삭제 비용이 크기 때문에, 추가 삭제가 많은 작업에는 지양되는 자료구조이다.

5. 연결리스트

5-a. 연결리스트란?

각 요소를 포인터로 연결하여 관리하는 선형 자료구조 요소(노드)는 데이터 영역과 포인터 영역으로 구성
 
배열과의 차이점
  • 메모리 저장방식의 차이
    • 배열은 메모리상에서 연속적으로 저장되지만, 링크드리스트는 포인터 주소값을 통해 공간에 제약없이 존재
      notion image
연결리스트 특징
  • 탐색시간 : O(n)
  • 추가/삭제 시간 : O(1)
    • 추가
    • 추가노드의 포인터영역을 다음노드로 지정
    • 이전노드의 포인터영역을 추가노드로 지정
    • 삭제
    • 이전 노드의 포인터를 다음노드로 지정
    • 삭제 노드의 포인터 삭제
 
연결리스트 종류
  • Singly Linked List
    • notion image
    • 탐색 O(n)
      • 방문노드의 데이터영역과 찾는 값을 비교
        • 다르다면 포인터 영역에 따라 다음 노드로 이동하여 반복
    • 추가 O(1)
      • 추가노드의 포인터영역을 다음 노드로 지정
      • 이전노드의 포인터영역을 추가 노드로 지정
    • 삭제 O(1)
      • 이전 노드의 포인터를 다음노드로 지정
      • 삭제 노드의 포인터 삭제
  • Doubly Linked List
    • notion image
    • 추가
      • 추가노드의 다음포인터를 다음노드로 변경
      • 다음노드의 이전포인터를 추가노드로 변경
      • 이전노드의 다음포인터를 추가노드로 변경
      • 추가노드의 이전포인터를 이전노드로 변경
    • 삭제
      • 이전노드의 다음포인터를 다음노드로 변경
      • 다음노드의 이전포인터를 이전노드로 변경
      • 삭제노드 삭제
  • Circular Linked List (환영 링크드리스트)
    • notion image
    • 탐색종료 조건이 필요함

6. 스택

6-a. 스택이란

Last In First Out을 가지는 선형 자료구조. 가장 최근에 들어온 것이 가장 먼저 나간다.
notion image
  • 함수호출은 대표적인 스택 자료구조이다.
  • Array의 push 및 pop을 통해 스택을 구현할 수 있다.

6-b. 실습

  • 💻올바른 괄호 문제 스택을 사용하여 풀어보기
    • 풀이방법
    • 오픈브라켓을 스택에 쌓는다 → count를 +1 해준다.
    • 클로즈브라켓일 경우 스택에서 제거한다 → count -1 을 해준다
    • count가 마이너스가 된다면, 없는 스택을 빼려고 한 것이므로 false를 리턴해준다.
    • 나의풀이
      function solution(s){ let open_braket_cnt = 0; for(let i = 0; i < s.length; i++){ if(open_braket_cnt < 0) return false; if(s[i] === '('){ open_braket_cnt += 1; } else { open_braket_cnt -= 1; } } return (open_braket_cnt === 0) ? true : false; }
      해설 참고
      💡
      전체적인 로직은 같았고, 변수명을 추상화하고, 불필요한 삼항연산제 제거 필요
      function solution(s){ let count = 0; for(let i = 0; i < s.length; i++){ if(count < 0) return false; if(s[i] === '('){ count += 1; } else { count -= 1; } } return (count === 0) }