본문 바로가기

Programming11

Clean Code - 깔끔한 변수명(Variable Name) 클린 코드/깔끔한 코드에 대해서 정리해보고자 한다. 이번글에서는 변수명을 어떻게 작성하는게 좋은지 정리하고자 한다. 의도가 분명할 것 변수, 함수, 클래스의 이름은 존재 이유, 수행 기능, 사용방법이 드러나야 한다. 주석이 필요하다면 의도를 드러내지 못했음을 의미한다. 맥락이 분명하다면 짧게 작성하자. 정보와 의미를 담아야 한다 연속적인 숫자는 의미를 담지 못한다. 개념의 구분이 없이 이름만 다른 경우 혼동을 준다. 발음하기 쉬울 것 (다음 예시의 위쪽 변수는 어떻게 읽겠을 수 있을까 ㅡㅡ; 사실상 불가능) 검색하기 쉬울 것 한 글자 변수명은 검색도 어렵고 직접 찾기도 어렵다. 숫자는 constant로 정의해두자. 인코딩을 피하자 헝가리안 표기법처럼 타입을 변수명 앞에 붙일 필요 없다. - 요즘 IDE는.. 2021. 12. 17.
3차원 펜윅 트리(Fenwick Tree/Binary Indexed Tree/Segment Tree) 최근 3차원 공간의 부분합을 많이 구해야 일이 생겼다. 속도가 느려서 팬윅트리를 이용하여 해결하고자 했는데, 3차원으로 가니 직관적이지 않다. 조금 공부를 했고, 3차원 팬윅트리 코드를 완성 시켜보았다. 까먹지 않기 위해 자체 PS 문제를 제작, 솔루션을 남겨본다. * 문제 설명 512^3 공간에서 인풋으로 주어진 범위 내의 '1' 을 카운트하여 반환하는 함수 작성 * 제약사항 힙 메모리 : 1gb 미만 스텍 메모리 : 1mb 미만 CPU TIME : 코드 참조 #include #include #include #include const int SIZE = 512; // 코드를 읽고 PASS를 출력하게 하는 CountDefect 함수를 작성하시오. // 제약사항 HEAP MEMORY < 1gb int Co.. 2021. 4. 16.
Cachegrind - cache, branch prediction 측정/분석/프로파일링 프로그램을 최적화하다가 if문 순서에 따른 성능이 이상하게 나와서 branch hazard와 관련한 성능 측정이 필요한 일이 생겼다. 구글링 결과 Valgrind를 이용하면 측정할 수 있을 것 같다. Valgrind Valgrind는 동적 분석 도구를 구축하기 위한 프레임 워크이다. 메모리 관리, 스레딩 버그 등등을 감지하고 프로그램을 자세하게 프로파일링 할 수 있는 도구들이 있다. 그중에서도 CacheGrind 기능을 이용하면 캐시 미스(cache miss), branch mis-prediction 등 cpu 단에서의 오버헤드들을 관찰할 수 있고, 성능 향상에 이용할 수 있다. Valgrind는 오픈소스로 GNU Genral Public License 2에 따라 무료로 이용할 수 있다. 사전 지식 일반.. 2021. 4. 15.
알고리즘 문제풀이 시간 단축을 위한 팁 (2) 1편에 이어서 몇 가지 더 써 보고자 한다. Cache를 고려하자 이 내용은 너무 기본적인 내용이라 넣을까 말까 고민을 했는데, 의외로 모르는 사람들이 많은듯해서 한 번 더 상기하고자 작성한다. 기본적으로 컴퓨터는 하나의 값을 읽어올 때 딱 그 변수를 읽어오는 것이 아니라. 주변에 있는 값을 포함해서 한 블록을 통째로 준비시킨다. 왜냐하면 통상적으로 주변에 있는 값들을 연속적으로 읽을 확률이 높기 때문이다. 따라서 연속해서 사용할 값은 쓴다면 연속한 위치에 있는 게 좋다. // 1000x1000 array 요소의 총 합을 반환 해주는 함수 void badSum(int a[1000][1000]) { int sum = 0; for(int x = 0 ;x < 1000 ; x++) for(int y = 0 ; .. 2021. 3. 31.
알고리즘 문제풀이 시간 단축을 위한 팁 (1) 라떼만해도 알고리즘 문제풀이 사이트라고 하면 백준, 알고스팟, 코드잼 같은 사이트 밖에 없었던 것 같은데, 우후죽순 많은 사이트들이 생겼고, 사이트들의 문제를 기반으로 많은 신입/경력 채용이 이루어지는 것 같다.(최근 이직 준비를 하면서 알게됨) 블로그에 알고리즘 카테고리를 하나 추가하면서, 중상급 이상의 문제에서 적용할 수 있는 테크닉, 풀이 접근방법 등을 정리해보고자 한다. 문제풀이 초/중급이라면 문제풀이를 할 때 어떤 알고리즘이 가장 최적화된 시간 복잡도로 풀이할 수 있는지 직관을 먼저 기르는 것을 추천한다. * 알고리즘 문제풀이에서만 해당되는 내용이며 실무에서는 정반대의 접근법으로 코드 작성을 해야 할 수도 있다. 이 점을 주의해야 한다. Function call 최소화 간단한 코드라면 funct.. 2021. 3. 29.
STL - Vector 삽입/삭제/정렬/복사 등 사용법 예제 임베디드 쪽 개발하는 현업에서 뛰다 보니 STL을 쓰지 않고 필요 기능만 구현해서 쓴다. 이직을 준비중인데 STL 사용법들이 잘기억나지 않아 복기 겸 정리해보고자 한다. 기본 동작 vector v; vector v(5); // 초기화 0, 5칸 vector v(5, 1); // 초기화 1, 5칸 v.push_back(1); // 마지막에 삽입 v.pop_back(); // 마지막 원소 제거 v.clear(); // 모두 제거 v.insert(1,2,3);// 1번째 위치에 3값을 2개 삽입 v.insert(1,2);// 1번째 위치에 2값을 삽입 v.erase(iter);// iter가 가르키는 놈을 삭제 v.erase(iter1, iter2);// iter1부터 iter2가 까지 범위 삭제 v.empt.. 2021. 3. 10.
Jupyter 환경에서 pip 패키지 설치하기 같은 질문은 여러 번 받다 보니 남기게 된다. python 은 개발자에 따라서 / 한 개발자의 다양한 프로젝트에 따라서 여러 가지 버전의 파이썬 인터프리터를 사용하게 되는데, 쉘상에서 pip 설치를 했더니 주피터에서는 안된다고 하시는 분들이 종종 있다. 그럴 경우 jupyter에서 사용 중인 인터프리터와 쉘상에서 가리키고 있는 파이썬 인터프리터가 다르기 때문인데, 해당 인터프리터를 찾기 귀찮으니 jupyter 상에서 아래와 같이 입력해서 설치해주면 된다. import sys !{sys.executable} -m pip install 2020. 9. 25.
Seaborn - 데이터를 시각화하는 17가지 방법 데이터 시각화는 데이터 마이닝에서 매우 중요한 역할을 한다. 데이터 과학자는 시각화를 통해 데이터를 탐구하는데 대부분의 시간을 보낸다. 이 과정을 가속화하기 위해서는 모든 플롯에 대한 충분한 이해와 설명서가 필요하다. 이 글을 통해 자주 사용했던 플롯들에 대한 정리해보고자 한다. Seaborn이란? Seaborn은 matplotlib 기반의 시각화 라이브러리이다. 유익한 통계 그래픽을 그리기 위한 고급 인터페이스를 제공한다. seaborn을 설치하기 위해서는 다음 쉘 명령어로 설치할 수 있다. pip install seaborn # pip를 이용한 설치 conda install seaborn # conda를 이용한 설치 그리고 파이썬에서 다음과 같이 임포트 해주면 사용할 준비가 끝난다. import se.. 2020. 9. 15.
OpenMP(2) - 입문자용 주요 사용법 간단한 설명/정리(omp single, master, task, taskwait, barrier) 저번 글에 이어서 몇 가지 더 사용법 정리. 사용법 1. omp single #pragma omp single // 하나의 thread만 실행한다. 다른 thread는 기다린다. #pragma omp single nowait // 하나의 thread만 실행한다. 다른 thread는 기다리지 않는다. 하나의 쓰레드만 동작하게 한다. 초기화나 출력부처럼 병렬 처리가 필요 없는 부분에서 용이하다. 2. omp master #pragma omp master // master thread만 실행한다. 다른 thread는 기다리지 않고 넘어간다. single과 매우 유사하지만 master thread 하나만 동작한다. 또한, 다른 쓰레드는 기다리지 않고 다음 부분을 실행한다. 3. omp task #pragma o.. 2020. 7. 31.
gdb - 간단한 명령어/사용법/단축어 정리(cheat sheet) GDB를 이용해 간간히 디버깅 하긴 했지만, 자주 사용하지 않아서 익숙하지 않았다. 앞으로 사용할 때마다 검색시간을 줄이기 위해 내가 사용하는/했던 gdb 명령어를 정리해놓기로 했다. 명령어를 정리하다가 마스코트를 찾아보았는데, gdb 마스코트는 위 그림의 금붕어이고, 이유를 찾아보니 벌레(버그)를 잡아먹고 물을 쏘아 벌레를 죽인다나 뭐라나.. 아무튼 그렇다고 한다. 급한 분들을 위한 cheat sheet 사전 조건 컴파일 시 -g 옵션을 주어야 함. GDB 실행 디버깅하기 위해 가장 먼저 해야 할 것은 해당 프로세스를 대상으로 gdb를 실행해야 한다. 여기서부터 설명되는 명령어는 대부분 단축어가 있다. 단축이 되는 글자를 파란색으로 표시하겠다. 중단점 설정/확인/해제 break : 중단점을 설정한다. .. 2020. 7. 30.
OpenMP(1) - 입문자용 주요 사용법 간단한 설명/정리(omp parallel, for, atomic,critical) 매일 GPU나 분산 컴퓨팅으로 병렬 처리만 하다가, 오랜만에 단일 cpu환경에서 thread로 병렬 처리를 해야 할 일이 생겼다. 학습하는 김에 주요 사용법을 정리해보고자 한다. 개발 환경 C/C++ OpenMP 5.0 API 사용법 1. omp parallel 기본 사용법 #pragma omp parallel //병렬 처리 할 한줄 #pragma omp parallel { /* 병렬 처리 할 여러줄 */ } 다음 한 줄이나 다음에 오는 중괄호에 묶인 구문을 병렬로 실행한다. thread 수만큼 실행된다. 옵션 #pragma omp parallel if(condition) #pragma omp parallel num_threads(n) #pragma omp parallel private(a) #pragm.. 2020. 7. 24.