💡코드 없는 알고리즘과 데이터 구조을 바탕으로 작성된 글입니다.
💡코드는 문제를 해결하기 위해 프로그래머의 생각을 표현한 것에 불과하다. 이론을 포함한 배경지식을 더 많이 알수록 문제 해결을 위한 더 많은 시도를 할 수 있다.
💡데이터 : 컴퓨터에 저장되어 있거나 컴퓨터가 가공 및 처리하는 모든 것.
💡정보 : 가공이나 처리가 끝난 데이터
💡데이터를 구성하고 저장하는 방법.(데이터를 담는 컨테이너)
데이터를 식별하는 방법을 제공하고 데이터의 관계를 보여주는 개념이다.
💡문제를 해결하기 위해 사용하는 일련의(논리적인) 단계.
정해진 순서대로 문제를 해결하는 방법이며, 간단하게 '절차'라고 할 수 있다.
🤔 직관적이고 명확해야하는 이유
컴퓨터는 사람과 달리 스스로 생각할 수 없다.찬장에서 접시를 꺼내라
라는 명령을 내렸을 때 만약 찬장의 문이 닫혀 있다면 문이 열릴 때까지 컴퓨터는 작동하지 않는다.
💡서로 다른 개념이면서 상호 보완적인 관계를 가진다.
💡자료형 : 처리할 데이터의 속성의 종류와 데이터로 수행하려는 작업의 종류를 컴퓨터에게 알려주기 위해 만들어진 것.
☝️🤓 올바른 데이터를 입력해도 무의미한 결과를 출력하는 상황
1. 알고리즘이 잘못되어 컴퓨터가 문제 해결 과정에서 오류를 내는 것.
2. 처리할 데이터의 자료형을 컴퓨터에 알리지 못해 수행할 동작을 결정하지 못하고 무의미한 결과를 출력하는 것.
🤔 전통적 컴퓨팅?
이진 데이터를 기반으로 한 컴퓨팅을 말한다.
켜고 끌 수 있는 수많은 트랜지스터(스위치)로 구성된 프로세서가 장착되어 있으며, 트랜지스터들을 켜고 끔으로서 복잡한 연산, 데이터 저장 등을 할 수 있다.
🤔 1워드?
CPU가 한 번의 버스 사티크를 통하여 메모리나 입출력 장치에 접근할 때 데이터의 크기
💡특정 동작을 수행하는 코드 덩어리. 수학적 개념.
정의역 : 입력값(독립변수)의 집합
치역: 결괏값(종속변수)의 집합
💡 매개변수(parameter)와 인수(argument)
- 매개변수 : 함수를 정의할 때 사용하는 변수(ex. sum(int a, int b))
- 인수 : 함수를 호출하며 전달하는 매개변수의 실제 값(ex. sum(1, 2))
💡메소드 : 객체지향 프로그래밍 언어에서 사용하는 클래스 내부에 있는 함수, 클래스의 객체 이름을 사용해 호출하는 함수를 뜻한다.
💡프로시저, 서브루틴 : 일부 프로그래밍 언어에서 함수를 일컫는 말. 프로시저는 값을 반환하지 않는 함수를 뜻하기도 한다.
💡재귀 : 자기참조.
재귀 함수 : 특정 조건을 충족할 때까지 자기 자신을 호출하는 함수
💡반복 : 특정 조건을 충족할 때까지 함수의 실행이 되풀이 되는 것
🚨
재귀와 반복은 특정 조건을 충족할 때까지 끊임없이 실행된다.
재귀 함수는 호출 횟수가 늘어날수록 컴퓨터의 가용 메모리 공간은 줄어들고, 호출 횟수의 한계인 최대 재귀 깊이를 초과해 스택 오버플로 에러가 발생한다.
: divide and conquer algorithm
💡 큰 문제를 여러 개의 작은 문제로 나눠 해결하고 결과를 결합해 하나의 해결 방법을 얻는 알고리즘.
: greedy algorithm
실행되는 순간마다 최상의 결정(가장 적합한 동작)을 내리는 알고리즘으로, 어떤 선택이 최선의 선택인지 순간적으로 판단해야 하며, 결단력이 필요하다.
💡 특정 순간에 최적인 해결방법을 찾는 알고리즘
: dynamic programming(동적 계획법)
💡 과거에 내린 결정이 앞으로의 결정에 영향을 주는 알고리즘.
문제를 해결하는 다양한 해결 방법을 찾아 저장한 후 나중에 재사용한다.
🤓☝️
탐욕 알고리즘은 근사치를, 동적 프로그래밍 알고리즘은 최적화를 한다.
알고리즘을 설계하는 것과 별개로 성능을 분석해야 할 필요가 있다. 문제를 해결하기 위해 사용하는 단계가 적을수록 더 효율적인 알고리즘이며, 이 효율성을 분석할 때 시간 복잡도와 공간 복잡도를 이용한다.
알고리즘이 문제를 해결할 때 점유하는 컴퓨터의 메모리 공간.
잘 사용하지 않는다.
주어진 입력에 다라 알고리즘이 문제를 해결할 때 걸리는 시간을 뜻한다.
💡 알고리즘을 실행하는 데 걸리는 최대 시간을 측정. 실행 시간이 최악인 경우를 나타내는 것이다.
빅 오 표기법