😎
Onemorebottlee's TIL
  • 🤓Introduce
  • 📖DevLog
    • 💣Error
      • npm ERR! Cannot read properties of null (reading 'edgesOut')
      • git
        • src refspec main does not match any
      • NextJS
        • No img element
        • ReferenceError : document is not defined
        • `next/image` Un-configured Host
  • 📺Lecture
    • Nomad Coders
      • 초보자를 위한 리덕스 101
        • #0 Introduction
        • #1 PURE REDUX: COUNTER
        • #2 PURE REDUX: TO DO LIST
        • #3 REACT REDUX
        • #4 Redux Toolkit
      • 바닐라 JS로 그림 앱 만들기
      • React JS 마스터 클래스
        • #2 Styled Componnents
        • #3 TypeScript
        • #4 Crypto Tracker
        • #5 State Management
        • #6 Trello
        • #7 ANIMATIONS
      • Next.js 시작하기
        • #0 INTRODUCTION
        • #1 FRAMEWORK OVERVIEW
        • #2 PRACTICE PROJECT
      • Typescript로 블록체인 만들기
        • #1 Introduction
        • #2 Overview of TypeScript
        • #3 Functions
        • #4 Classes and Interfaces
        • #5 TypeScript Blockchain
      • SQL Master Class
        • #1 Introduction
        • #2 SQLite
        • #3 Data Definition Language
        • #4 Data Manipulation Language
        • #5 Subqueries and CTEs
        • #6 Indexes
        • #7 MySQL
        • #8 Foreign Keys
        • #9 JOINS
        • #10 Nomalization
        • #11 Events & Triggers
        • #12 Full-Text Indexes
        • #13 PostgreSQL
        • #14 Functions And Procedures
        • #15 Transactions
        • #16 Data Control Language
        • #17 PostgreSQL JSON Columns
        • #18 PostgreSQL Extensions
        • #19 MongoDB
        • #20 REDIS
        • #21 Javascript and Python Drivers
    • Udemy
      • TypeScript 마스터 with Webpack & React
        • [S1] 소개
        • [S2] 설치 및 설정
        • [S3] 타입 애너테이션 기초
        • [S4] 함수
        • [S5] 객체 타입
        • [S6] 배열 타입
        • [S7] 유니온타입
        • [S8] Tuple & Enum
        • [S9] 인터페이스
        • [S10] TypeScript 컴파일러
        • [S11] 미니 프로젝트 DOM, 타입 단언, 그리고 더 많은 내용
        • [S12] Class
        • [S13] TS Class
        • [S14] Generics ⭐⭐⭐⭐⭐
        • [S15] Narrowing
        • [S16] Type Declarations
        • [S17] Module
        • [S18] Webpack 과 TypeScript
        • [S19] React
    • 모두를 위한 컴퓨터 과학 CS50
      • 1. 컴퓨팅 사고
      • 2. C언어
      • 3. 배열
      • 4. 알고리즘
      • 5. 메모리
      • 6. 자료구조
    • 생활코딩
      • DATABASE
        • DATABASE1
  • 📚Book
    • 모던 자바스크립트 Deep Dive
      • 1장 프로그래밍
      • 2장 자바스크립트란?
      • 3장 자바스크립트 개발 환경과 실행 방법
      • 4장 변수
      • 5장 표현식과 문
      • 6장 데이터 타입
      • 7장 연산자
      • 8장 제어문
      • 9장 타입 변환과 단축 평가 ⭐⭐⭐
      • 10장 객체 리터럴
      • 11장 원시 값과 객체의 비교
      • 12장 함수 ⭐⭐⭐⭐
      • 13장 스코프
      • 14장 전역 변수의 문제점
      • 15장 let, const 키워드와 블록 레벨 스코프 ⭐⭐⭐
      • 16장 프로퍼티 어트리뷰트
      • 17장 생성자 함수에 의한 객체 생성
      • 18장 함수와 일급 객체 ⭐⭐
      • 19장 프로토타입 ⭐⭐⭐⭐⭐
      • 20장 strict mode
      • 21장 빌트인 객체 ⭐
      • 22장 this ⭐⭐⭐
      • 23장 실행 컨텍스트 ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 24장 클로저 ⭐⭐⭐⭐⭐⭐⭐
      • 25장 클래스
      • 26장 ES6 함수의 추가 기능
      • 27장 배열 ⭐⭐⭐
      • 28장 Number
      • 29장 Math
      • 30장 Date
      • 31장 RegExp
      • 32장 String
      • 33장 7번째 데이터 타입 Symbol
      • 34장 이터러블
      • 35장 스프레드 문법
      • 36장 디스트럭처링 할당
      • 37장 Set과 Map
      • 38장 브라우저의 렌더링 과정⭐⭐⭐⭐⭐⭐⭐⭐
      • 39장 DOM ⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 40장 이벤트⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
      • 41장 타이머
      • 42장 비동기 프로그래밍 ⭐⭐⭐⭐⭐⭐⭐⭐
      • 43장 Ajax
      • 44장 REST API
      • 45장 프로미스
      • 46장 제너레이터와 async/await
      • 47장 에러 처리
      • 48장 모듈
      • 49장 Babel과 Webpack을 이용한 ES6+/ES.NEXT 개발 환경 구축
    • 러닝 타입스크립트
      • Ch.1 자바스크립트에서 타입스크립트로
      • Ch.2 타입 시스템
      • Ch.3 유니언과 리터럴
      • Ch.4 객체
      • Ch.5 함수
      • Ch.6 배열
      • Ch.7 인터페이스
      • Ch.8 클래스
      • Ch.9 타입 제한자
      • Ch.10 제네릭
      • Ch.11 선언 파일
      • Ch.12 IDE 기능 사용
      • Ch.13 구성 옵션
      • Ch.14 구문 확장
      • Ch.15 타입 운영
      • 용어 사전
    • 자바스크립트 완벽 가이드
    • SQL in 10 Minutes
      • 1장 SQL 이해하기
      • 2장 데이터 가져오기
      • 3장 가져온 데이터 정렬하기
      • 4장 데이터 필터링
      • 5장 고급 데이터 필터링
      • 6장 와일드카드 문자를 이용한 필터링
      • 7장 계산 필드 생성하기
      • 8장 데이터 조작 함수 사용하기
      • 9장 데이터 요약
      • 10장 데이터 그룹핑
      • 11장 서브쿼리 사용하기
      • 12장 테이블 조인
      • 13장 고급 테이블 조인 생성하기
      • 14장 쿼리 결합하기
      • 15장 데이터 삽입하기
      • 16장 데이터 업데이트와 삭제
      • 17장 테이블 생성과 조작
      • 18장 뷰 사용하기
      • 19장 저장 프로시저 사용하기
      • 20장 트랜잭션 처리 관리하기
      • 21장 커서 사용하기
      • 22장 고급 데이터 조작 옵션
    • 면접을 위한 CS 전공지식 노트
      • 4 데이터베이스
        • 4.1 데이터베이스의 기본
    • 2023 이기적 SQL 개발자 이론서 + 기출문제
      • 데이터 모델링 이해
        • S1. 데이터 모델링
  • 💻Study
    • CS 지식 발표
      • 1회차
      • 2회차
      • 3회차
      • 4회차
      • 5회차
      • 6회차
      • 7회차
      • 8회차
      • 9회차
    • TypeScript Exercises
      • Ex 1
      • Ex 2
      • Ex 3
      • Ex 4
      • Ex 5
      • Ex 6
      • Ex 7
      • Ex 8
      • Ex 9
      • Ex 10
  • 🔄ETC
    • Article
      • Atomic Design Pattern
      • 프론트엔드 개발자
    • DATABASE
      • Oracle
        • CEIL() & FLOOR() - 소수점 올림 & 내림
        • DUAL 테이블 - 임시 테이블로 결과 확인하기
    • Ubuntu
      • 어플리케이션 업데이트
Powered by GitBook
On this page
  • 1) 검색 알고리즘
  • 2) 알고리즘 표기법
  • 3) 선형 검색
  • 4) 버블 정렬
  • 5) 선택 정렬
  • 6) 정렬 알고리즘의 실행시간
  • 7) 재귀
  • 8) 병합 정렬

Was this helpful?

  1. Lecture
  2. 모두를 위한 컴퓨터 과학 CS50

4. 알고리즘

Previous3. 배열Next5. 메모리

Last updated 1 year ago

Was this helpful?

1) 검색 알고리즘

배열은 한 자료형의 여러 값들이 메모리상에 모여 있는 구조이다. 컴퓨터가 이 값에 접근할 때는 배열의 인덱스 하나하나에 접근하게 된다. 배열 안에 어떤 값이 있는지 확인하기 위해서는 다양한 방법이 있다.

2) 알고리즘 표기법

Big O - 알고리즘 실행 시간의 상한 (최악의 경우)

Big Ω - 알고리즘 실행 시간의 하한 (최선의 경우)

  • O(n^2)

  • O(n log n)

  • O(n)

  • O(log n)

  • O(1)

3) 선형 검색

선형검색 - 원하는 원소가 발견될 때까지 처음부터 마지막 자료까지 차례대로 검색한다.

모든 자료를 확인하기에 정확하지만 비효율적인 방법이다.

자료가 정렬되어있지 않거나, 추가적인 정보가 없어 모든 자료를 확인해야 하는 경우 유용하다.

#include <cs50.h>
#include <stdio.h>
#include <string.h>

typedef struct
{
    string name;
    string number;
}
person;

int main(void)
{
    person people[4];

    people[0].name = "EMMA";
    people[0].number = "617–555–0100";
    people[1].name = "RODRIGO";
    people[1].number = "617–555–0101";
    people[2].name = "BRIAN";
    people[2].number = "617–555–0102";
    people[3].name = "DAVID";
    people[3].number = "617–555–0103";

    // EMMA 검색
    for (int i = 0; i < 4; i++)
    {
        if (strcmp(people[i].name, "EMMA") == 0)
        {
            printf("Found %s\\n", people[i].number);
            return 0;
        }
    }
    printf("Not found\\n");
    return 1;
}

4) 버블 정렬

버블 정렬은 정렬 알고리즘 중 하나로, 인접한 두 개의 자료 값을 비교하고 위치를 교환하는 방식으로 정렬하는 방법이다. 두개의 요소만 정렬하는 좁은 범위의 정렬에 집중하기에 간단하지만 정렬에 너무 많은 자원을 낭비하는 방법이기도 하다.

3 6 8 5 2 7 4 1

3 6 8 5 2 7 4 1

3 6 5 8 2 7 4 1 <

3 6 5 2 8 7 4 1 <

3 6 5 2 7 8 4 1 <

3 6 5 2 ****7 4 8 1 <

3 6 5 2 ****7 4 1 8 <

…

1 2 3 4 5 6 7 8

O(n^2)

Ω(n^2)

5) 선택 정렬

선택 정렬은 배열 안의 자료 중 가장 작은 수를 찾아 첫 번째(혹은 마지막)의 수와 교환하는 방식의 정렬이다. 교환 횟수를 최소화하는 반면 각 자료를 비교하는 횟수는 증가한다.

6 3 8 5 2 7 4 1

1 3 8 5 2 7 4 6

1 2 8 5 3 7 4 6

1 2 3 5 8 7 4 6

1 2 3 4 8 7 5 6

1 2 3 4 5 7 8 6

1 2 3 4 5 6 8 7

1 2 3 4 5 6 7 8

O(n^2)

Ω(n^2)

6) 정렬 알고리즘의 실행시간

정렬의 조건을 추가해 효율을 높일 수 잇다.

실행시간의 상한

  • O(n^2): 선택 정렬, 버블 정렬

  • O(n log n)

  • O(n): 선형 검색

  • O(log n): 이진 검색

  • O(1)

실행시간의 하한

  • Ω(n^2): 선택 정렬, 버블 정렬

  • Ω(n log n)

  • Ω(n)

  • Ω(log n)

  • Ω(1): 선형 검색, 이진 검색

⇒ 버블 정렬의 안쪽 루프에서 교환이 발생하지 않는다면 정렬이 잘된 상황이기에 바깥쪽 루프의 조건을 교환이 발생하지 않을때까지로 수정하면 하한 시간이 바뀐다.

실행시간의 하한

  • Ω(n^2): 선택 정렬

  • Ω(n log n)

  • Ω(n): 버블 정렬

  • Ω(log n)

  • Ω(1): 선형 검색, 이진 검색

7) 재귀

재귀는 스스로를 호출해 사용하는 함수를 말한다.

문제를 작게 쪼개 가장 작은 단위까지 쪼갠 후 그 문제를 해결한다. 같은 방식으로 큰 단위의 문제를 해결하게 설정하면 된다.

재귀는 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우나 반복문의 중첩 횟수를 예측하기 어려운 경우 사용한다.

8) 병합 정렬

병합 정렬은 원소가 한 개가 될 때까지 계속해서 반으로 나누다가 다시 합쳐나가며 정렬하는 방식이다.

분할 > 병합의 과정을 재귀적으로 거친다.

7 4 5 2 6 3 8 1

7 4 5 2 | 6 3 8 1 < 분할

7 4 | 5 2 | 6 3 8 1 < 분할

7 | 4 | 5 2 | 6 3 8 1 < 분할 - 더이상 분할되지 않음

4 7 | 5 2 | 6 3 8 1 < 병합 - 작은 숫자가 먼저 오도록

4 7 | 2 5 | 6 3 8 1 < 병합

2 4 5 7 | 6 3 8 1 < 병합

…

1 2 3 4 5 6 7 8

O(n log n)

Ω(n log n)

📺