Language 89

Exchange, Insertion, Selection, Merge, Quick, Shell Sort Algorithms

본 글은 알고리즘 설계 과목에서 작성한 코드를 기반으로 한 글입니다. 💡 Exchange sort 정렬되지 않은 배열에서, Index 키와 나머지 키를 비교하여, 가장 작은 키를 인덱스 순차적으로 위치시키는 알고리즘 void exchangeSort(vector&arr) { int N = arr.size(); for(int i = 0; i < N - 1; i++) { for (int j = i + 1; < N - 1) { if (arr[j] < arr[i]) { swap(arr[i], arr[j]) } } } } 시간복잡도는 항상 모든 배열의 내용을 비교하므로 O(n^2)이며 배열 내 정렬이 일어나므로 공간 복잡도는 O(1)이다. 💡 Insertion sort 정렬되지 않은 배열에서 순차적으로 키를 선택해..

Language/C++ 2023.03.16

Let's measure time complexity by n^3 and 2^n

본 글은 알고리즘 설계 과목에서 작성한 코드를 기반으로 한 글입니다. 💡 Time Complexity 알고리즘을 실행하는 데 걸리는 시간을 의미합니다. Q1. n^3을 만족하는 2차 행렬 a, b, c의 곱셈을 기반으로 하는 3중 for loop를 작성하라. #include #include using namespace std; int main() { const int n[] = {10, 50, 100, 150, 200}; clock_t start, finish; double duration; for (int i = 0; i < 5; i++) { int N = n[i]; int a[N][N], b[N][N], c[N][N]; start = clock(); for (int i = 0; i < N; i++) ..

Language/C++ 2023.03.06

Java 02. static과 final

자바 API에서 final 키워드를 발견하여 보다 자세히 다시 정리해본다. Final 자바 언어에서 final 키워드는 오직 한번만 할당할 수 있는 entity를 정의할 때 사용된다. final로 선언된 변수가 할당되면 항상 같은 값을 가진다. 즉, 한번 값을 입력하면 바뀌지 않으며 final은 클래스, 메소드, 변수 등에 붙어 사용이 가능하다. Static static은 변수나 함수에 붙는 키워드이며 이를 붙일 경우, 메모리에 한번만 할당되어 메모리를 효율적으로 사용할 수 있다. Static과 Final 혼용 final 변수를 사용한다는 것은 할당된 값을 계속해 사용하겠다는 의미이다. 그렇기에 같은 값을 계속 사용할 것이라면 메모리 낭비 없이 사용하기 위해 static과 final을 함께 사용하여 효율..

Language/Java 2023.01.14

Javascript 네임스페이스 패턴(Namespace Pattern)

전역 네임스페이스 (Global Namespace)의 오염 문제를 코드 리뷰를 하다 알게 되었다. 특히 여러 스크립트가 한 소스 안에 있는 코드에서는 전역 변수 네임이 겹칠 우려가 있고 이는 소스의 신뢰성이 낮아진다는 단점으로 연결된다. 네임 스페이스 패턴? 전역 유효 범위가 많은 변수, 객체, 함수 등으로 코드가 어지러워지지 않도록 전역 객체 하나만 만들고, 모든 기능을 이 객체 안에 추가하는 패턴을 네임스페이스 패턴이라고 한다. 네임스페이스 패턴을 적용하지 않은 상태) // variable var variable = 0; // object var obj = {}; // function function a(){}; 네임스페이스 패턴을 적용한 상태) var APP = {}; // variable APP...

Language/JavaScript 2023.01.10

기본 정렬 알고리즘 - 버블 정렬, 선택 정렬, 삽입 정렬

버블 정렬 버블 정렬은 가장 근접한 두 요소를 비교하며 둘의 순서를 교체하는 정렬 방식이며 이를 오름차순/내림차순으로 정렬될 때까지 반복한다. 정렬은 마지막 요소를 제외하고 계속 반복하며 최악의 경우 n-1 (n은 데이터 개수) 번 반복하는 O(n2)의 시간복잡도를 가진 알고리즘이다. 가장 쉽게 떠올릴 수 있는 알고리즘이지만 가장 비효율적이다. 선택 정렬 선택정렬은 loop마다 가장 작은 값을 찾고 swap할 위치에 넣어준다. 선택정렬은 요소를 비교하고 swap하는 버블정렬과 달리 한번 카드를 훑은 다음 swap을 하는 과정을 n-1 (n은 데이터 개수) 번 반복하기 때문에 버블 정렬보다 2배 더 빠르며 어떻게 정렬되어 있든 일관된 n(n-1) 에 비례한다. 삽입 정렬 비교할 전 요소가 없기 때문에 첫번..

Language 2023.01.07

객체지향프로그래밍

객체지향프로그래밍이란? 객체지향프로그래밍은 프로그래밍에서 필요한 데이터를 추상화 시켜 상태와 행위를 가진 객체로 만들고, 객체들간의 상호작용을 통해 로직을 구성하는 프로그래밍 방법이다. 객체지향프로그래밍의 특징 객체지향프로그래밍은 크게 추상화 , 캡슐화 , 상속 , 다형성 의 네가지 특징을 가진다. 1. 추상화 객체에서 공통된 속성과 행위를 추출 하는 것 공통의 속성과 행위를 찾아서 타입을 정의하는 과정 추상화는 불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단하게 만드는 것 추상화가 왜 필요할까? 다른 곳의 코드를 수정할 필요 없이 추가로 만들 부분만 새로 생성해주면 된다. 2. 캡슐화 변수와 함수를 하나로 묶는 것 낮은 결합도를 유지할 수 있도록 설계하는 것 속성과 기능을 정의하는 ..

Language 2023.01.07

Java 01. 다차원 배열

배열이란? 배열은 동일한 타입의 데이터를 연속적으로 저장한 자료구조입니다. 배열의 특징은 '정적'이며 '연속적'이라는 거에요. 처음 배열의 크기를 정하면 변경할 수 없고, 메모리 상에서 모든 요소들이 저장된 위치는 연속적으로 붙어있습니다. 배열의 생성 배열은 동일한 타입의 데이터를 연속적으로 저장한 자료구조입니다. 배열의 특징은 '정적'이며 '연속적'이라는 거에요. 처음 배열의 크기를 정하면 변경할 수 없고, 메모리 상에서 모든 요소들이 저장된 위치는 연속적으로 붙어있습니다. int[] a = new int[5]; 배열을 만들 때는 키워드 new를 사용합니다. 크기가 5인 Array 객체를 Reference type 변수 a에 저장하라는 의미에요. 이때 Array 객체는 Heap 메모리에서 생성될 겁니다..

Language/Java 2023.01.05

JavaScript 09. 함수와 일급 객체

모던 자바스크립트 Deep Dive 자바스크립트의 기본 개념과 동작 원리를 읽고 정리한 내용입니다. 18.1 일급 객체 무명의 리터럴로 생성할 수 있다. 즉, 런타임에 생성이 가능하다. 변수나 자료구조에 저장할 수 있다. 함수의 매개변수에 전달할 수 있다. 함수의 반환값으로 사용할 수 있다. 18.2 함수 객체의 프로퍼티 Object.getOwnPropertyDescriptor(square, '__proto__'); // undefined Object.getOwnPropertyDescriptor(Object.prototype, '__proto__'); // undefined arguments 객체는 배열 형태로 인자 정보를 담고 있지만 실제 배열이 아닌 유사 배열 객체다. 유사 배열 객체란 length ..

Language/JavaScript 2022.09.17

JavaScript 08. 생성자 함수에 의한 객체 생성

모던 자바스크립트 Deep Dive 자바스크립트의 기본 개념과 동작 원리를 읽고 정리한 내용입니다. 17.1 생성자 함수에 의한 객체 생성 생성자 함수는 new 연산자와 함께 호출하여 객체 (인스턴스)를 생성하는 함수를 말한다. 생성자 함수에 의해 생성된 객체를 인스턴스라 한다. 17.2.3 생성자 함수의 인스턴스 생성 과정 인스턴스를 생성하고 생성된 인스턴스를 초기화 (인스턴스 프로퍼티 추가 및 초기값 할당)하는 것이다. 바인딩이란 식별자와 값을 연결하는 과정을 의미한다. 변수 이름(식별자)와 확보된 메모리 공간의 주소를 바인딩하는것이다. this가 가리킬 객체를 바인딩하는 것도 바인딩의 예이다. 17.2.4 내부 메서드 [[Call]]과 [[Construct]] function foo() { //일반..

Language/JavaScript 2022.09.13

JavaScript 07. 프로퍼티 어트리뷰트

모던 자바스크립트 Deep Dive 자바스크립트의 기본 개념과 동작 원리를 읽고 정리한 내용입니다. 16.1 내부 슬롯과 내부 메서드 모든 객체는 [[Prototype]]이라는 내부 슬롯을 갖는다. o.__proto__ // Object.prototype 16.2 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체 자바스크립트 엔진은 프로퍼티 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의한다. Object.getOwnPropertyDiscripter(person, 'name'); 16.3 데이터 프로퍼티와 접근자 프로퍼티 데이터 프로퍼티는 키와 값으로 구성된 프로퍼티다. 지금까지 살펴본 모든 프로퍼티는 데이터 프로퍼티다. 접근자 프로퍼티는 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 ..

Language/JavaScript 2022.09.12