[Algorithm] Basics 2
·
Data Structures and Algorithms
반례를 찾을 수 없다 ≠ 좋은 알고리즘이다 우리는 어떠한 명제가 자명하다는 사실을 증명을 통해 밝혀내야 한다. 대표적인 방법으로는 Induction이 있다. Induction Principle 수학적 귀납법의 원리를 따른다. 1. State that the proof uses induction - induction을 이용하여 증명할 것을 명시 2. Define an appropriate predicate P(n) - 최종적으로 증명할 명제를 명시 3. Prove that P(0) is true - 이 시작점을 우리는 Base case or Basis step이라고 부름 4. Prove that P(n) implies P(n+1) for every natural number n - 이걸 inductive ..
[OS] - Thread 스레드에 대해 알아보자
·
OS (Operating Systems)
Thread?- A single unique execution context- Mechanism for concurrency (동시성) + can also run in parallel (병렬성)- Protection (보호) → 쓰레드 간 자원 접근을 제어하고 안전하게 관리하기 위한 메커니즘 MTAO (multiple things at once)- 운영 시스템은 프로세스, 인터럽트, 백그라운드 시스템 유지 등 다양한 것들을 한 번에 핸들링할 수 있어야 함- 네트워크 서버, 병렬 프로그램, UI를 지닌 프로그램, 그리고 network/disk bound 프로그램도 마찬가지→ 이러한 것들을 가능하게 해주는 것이 바로 Thread스레드는 동시성의 유닛이고, 각각의 쓰레드는 하나 혹은 한 태스크를 표현할 수 있..
[Algorithm] Basics 1
·
Data Structures and Algorithms
Algorithm 좋은 알고리즘의 특성 1. Correct 2. Efficient 3. Easy to implement 이 순서대로 중요하게 여기고, 이 세가지를 동시에 만족시키지 못할 수도 있음. Collect algorithm? - 모든 input에 대해 정확한 output에 멈춰야 한다. - 프로그램이 멈추지 않거나, 오답에서 멈춘다면 옳은 알고리즘이 아님. - 가끔 incorrect algorithm이 유용하게 쓰일 데가 있음! → Error rate 제어가 가능하다면 - Correct vs Incorrect를 구별하려면 Proof가 필요 Correctness를 증명하려면 입력 가능한 instance를 명확히 알아야 하고. 알고리즘의 출력값의 요구되는 특성을 명확히 알아야 함. 문제에 대한 오류 ..
[Dev, Python] Firebase Realtime Database를 Python으로 다뤄보자
·
Dev/etc
서버 개발자가 아니거나, 간단한 사이드 프로젝트를 하는 입장에서 백엔드를 필요로 하는 상황이 굉장히 많이 발생한다. 이를 해결해 줄 것이 바로 Google의 Firebase인데, 지금 내가 서비스 운영 중인 명언 iOS 앱 또한 간단한 명언 데이터를 수집/제공해 줄 목적으로 Firebase의 Realtime Database 서비스를 이용 중이다. 이 앱의 Android OS는 동료 개발자가 운영하고 있는데, 현재는 서비스 앱 말고도 수집된 명언 데이터를 처리하는 간단한 앱 또한 이 친구가 만들어 둬 좀 더 수월한 데이터 처리를 돕고 있었다. 이 앱을 운영한 지가 어엿 4년 차가 돼 가는데, 둘 다 소프트웨어 공학적 지식이 불충분한 상태에서 시작했기에 디자인 패턴을 고려하지 않았고, 기능을 추가할수록 코드..
[OOP, C++] Class 기초 - 선언, 초기화, 사용
·
OOP (Object Oriented Programming)
본격적인 객체 지향 프로그래밍의 시작이다. 클래스를 선언하고 초기화하고 사용하는 법까지 account라는 Class를 통해 알아보도록 하자. 헤더 파일 먼저 class를 선언하는 곳은 소스 파일이 아닌 헤더 파일이라는 사실이 중요하다. 그 이유는 클래스를 헤더 파일에 선언함으로써 코드의 재사용성, 가독성, 유지 보수성을 높일 수 있고, 컴파일 타임 최적화와 컴파일 시간 단축을 이룰 수 있기 때문이며, 객체 지향 프로그래밍의 핵심 중 하나이다. 우리가 만들 account라는 클래스는 다음과 같은 구조를 가진다. 1. 계좌의 잔액 2. 계좌의 잔액을 로그에 출력하는 메서드 3. 계좌의 잔액을 다른 계좌에 전달하는 메서드 // account.h class account { int balance; public:..
[Syntax, C++] Reference(&) - 참조란?
·
OOP (Object Oriented Programming)
객체 지향 프로그래밍을 향한 마지막 관문이다. reference는 object에 specific 한 개념은 아니지만, 종종 자주 쓰이기 때문에 알아두면 좋다. // By pointer void foo(int* num) { *num *= 2; } // By reference void foo(int& num) { num *= 2; } 어떤 변수의 값을 함수를 통해 변경하는 방법은 C를 이용한 포인터의 개념을 설명할 때 언급한 적이 있다. 바로 변수의 주소를 보내고, 그 주소를 역참조하여 변수의 값을 변경시키는 것이다. 이와 같이 포인터를 이용하여 주어진 변수의 값을 변경할 수도 있지만 reference를 이용하는 방법도 있다. 왜 두 가지 방법이 존재하는 걸까? 그리고 이들의 장단점은 뭘까? 포인터의 장점 ..
[Dev, Javascript] D3 예제 - 스택 바 차트(Stack Bar Chart)
·
Dev/Web
지난 시간에 이어서 이번에도 주어진 csv 파일 속 데이터를 필터링 및 매핑하여 원하는 그래프(Stack Bar Chart)로 시각화해 보자. 주어진 데이터는 나라별/날짜별 인구수, 코로나 19 백신 접종자 수(부분 및 전체 포함), 코로나 19 백신 완전 접종자 수를 Key로 가지고 있다. 해당 데이터로 각 나라별 최신 정보 중 접종률이 가장 높은 국가 15개국을 부분/전체/인구수를 스택으로 담는 스택 바 차트로 표현해보려 한다. 주어진 조건은 다음과 같다. 1. 나라별 최신 데이터만을 사용(국가별 최신 정보가 달라도 좋다.) 2. 모든 인구가 접종한 경우는 제거(접종률이 100% 이상인 경우) 3. 접종률을 내림차순으로 정렬, 상위 15개 국가만을 필터링 이를 통해 표현하고자 하는 그래프는 다음과 같..
[Syntax, C++] struct, enum, union을 활용하여 계산기 구현하기
·
OOP (Object Oriented Programming)
pointer, array, struct, enum, enum class... 이 정도만 하면 얼추 C++에서 객체 지향 프로그래밍을 하기 위한 준비는 끝마쳤다고 볼 수 있겠다. class에 관한 syntax는 OOP와 함께 다뤄볼 예정이다. 함수와 구조체를 사용하는 이유는 복잡한 반복되는 과정을 효율적으로 처리하기 위함이다. 이번 시간에는 주어진 입력이 정수, 실수, 허수인지를 알아서 분기하여 사칙연산을 수행할 수 있게 하는 계산기를 만들 예정이다. 더하기와 빼기는 비교적 쉬우므로, 곱하기와 나누기 정도만 구현해 보도록 하자. 1. 수를 담는 구조체 (타입은 enum으로 분기, union으로 한 수에는 하나의 타입 매칭) 2. 수를 로그에 출력하는 함수 3. 수의 실수 부분(real_component)..
100두산
정상에서 보자 ✈️