기본 콘텐츠로 건너뛰기

10월, 2020의 게시물 표시

개발 공부 - [정렬] 정렬의 lower bound

 Comparison Sort 기존 것의 최선인 O(nlogn) 보다 더 좋은 시간복잡도 알고리즘을 위해! - 데이터들간의 상대적 크리관계만을 이용해서 정렬하는 알고리즘 - 따라서 데이터들간의 크기 관계가 정의되어 있으면, 어떤 데이터에든 적용가능 (문자열, 알파벳, 사용자 정의 객체 등) - 버블소트, 삽입정렬, 합병정렬, 퀵소트, 힙정렬 등 Non-comparison sort - 정렬할 데이터에 대한 사전지식을 이용, 적용에 제한 -  Bucket sort - Radix sort 하한 (Lower bound) - 입력된 데이터를 한번씩 다 보기 위해서 최소 O(n)의 시간복잡도 필요 - 합병정렬과 힙정렬 알고리즘들의 시간복잡도는 O(nlog2n) - 어떤 comparison sort 알고리즘도 O(nlog2n)보다 나을 수 없다. Decision Tree로 기재해서 보여 줌... 세가지 경우의 수 merge 하는 거 -.-) Decision Tree Leaf 노드의 개수는 n!개 (모든 순열에 해당) 최악의 경우 시간 복잡도는 트리 높이  - 전체 트리의 높이가 n!일 때 전체 트리의 개수는 logn!을 넘을 수 없음 logn!= O(nlogn) = 스털링의 정의라는걸 이용하면 nlog2n 이라고 함 이진 트리의 경우 트리의 높이는 height ≥ log2n! = O(nlog2n)

운동 정보 - 어메이즈핏 밴드 5 스마트밴드 나이키 런 클럽(NRC = Nike Run Club) 연동

 나이키 런 클럽 쓰려고 산 어메이즈핏 밴드5 인데 연동이 영 어려워서 찾아보고 써봤다. 1. Zepp 앱은 연동이 되어 있어야 한다. 2.  Zepp 앱 -> 프로필 -> 내 기기 -> Amazfit Band 5 3. 검색 가능 : 켜짐 활동 심박수 공유 : 켜짐 연결 제한 : 꺼짐 (기본) 백그라운드에서 실행 : 제외로 등록 4. NRC(나이키 런 클럽) 앱 -> 설정 -> 러닝 설정 -> 기기 5. 심박수 표시 -> 블루투스에서 AmazFit Band 5 누르고 NRC 즐기면 된다! * 안드로이드 이용자입니다.

개발 공부 - [정렬] 힙(heap)의 다른 응용 : 우선순위 큐 (priority queue)

1) 최대 우선순위 큐 (maximum priority queue)는 다음의 두 가지 연산을 지원하는 자료구조 - INSERT (x) : 새로운 원소 x를 삽입 - EXTRACT_MAX() : 최대값을 삭제하고 반환 2) 최소 우선순위 큐 (minimum priority queue)는 EXTRACT_MAX 대신 EXTRACT_MIN을 지원하는 자료구조 3) MAX HEAP을 이용하여 최대 우선순위 큐를 구현 INSERT의 수도 코드 MAX-HEAP-INSERT(A, key){     heap_size = heap_size+1;     A[heap_size] = key;     i = heap_size;     while(i>1 and A[PARENT(i)] < A[i] ){          exchange A[i] and A[PARENT(i)];          i = PARENT(i);      } } EXTRACT_MAX()의 수도 코드 HEAP_EXTRACT_MAX(A) if heap_size[A] < 1     그러면 에러 heap underflow max <- A[1]     A[1] <- A[heap_size[A]]     heap-size[A] <- heap-size[A] - 1     MAX-HEAPIFY(A,1)     return max

개발 공부 - [컴퓨터과학] 알고리즘 - 이진 검색

앞에 알고리즘에서 [추측 게임] 을 단계별로 나타내 보면, 1. min = 1 , max = n 으로 둔다. 2. max와 min의 평균을 구하되, 정수가 되도록 내림한다. 3. 추측이 맞으면 끝낸다 (숫자를 찾았다.) 4. 추측값이 너무 작으면 min을 추측값보다 1 크게 설정한다. 5. 추측값이 너무 크면 max를 1 작게 설정한다. 6. 다시 2단계로 돌아간다.  이걸 수도 코드로 표현해 보면 1. min = 0 이고 max = n-1이라고 한다. 2. guess 의 값은 max와 min의 평균값을 정수가 되도록 버림한 값이다. 3. array[guess]의 값이 target과 같다면 검색을 멈춘다. (타겟을 찾았다 -> guess를 결과값으로 반환한다.) 4. 추측값이 더 작을 경우 (array[guess] < target) 에는 min = guess+1로 바꾼다. 5. 아니면 추측값이 더 클 경우에는 max = guess -1 로 바꾼다. 6. 다시 2단계로 돌아간다. 1. 32개 팀이 2014 월드컵에 진출하게 되었습니다. 팀명들을 (배열로) 정렬한다고 할 때, 최악의 경우에서 이진 검색을 활용해 배열 내에서 특정 팀을 찾아내고자하면 몇 개의 항목을 확인해야 할까요? -> 2^6 이니까 6  2. 밑이 2인 32의 로그인 \log(32)log(32)log, left parenthesis, 32, right parenthesis는 무엇일까요? -> 2^5 = 5 3.2에서 311까지 소수를 정렬한 배열이 있습니다: [2, 3, 5, 7, 11, 13..., 307, 311]. 항목의 수는 64개이며, 이진 검색에서 52가 배열에 없으므로 소수가 아니다는 결론을 내릴 때까지 얼마나 많은 항목을 확인해야 할까요? -> 7 4.2013년 유엔 회원국의 수는 193개국 이었습니다. 이 국가명들은 알파벳 순으로 배열내에서 정렬한다면, 이진 검색을 활용하여 특정한 국가명을 찾을 때까지 최악의 경우 몇 개의 국가명을 확인해야 할까요? -

개발 공부 - [정렬] 힙 정렬(heap sort) -3 (Section 3)

 정렬할 배열을 힙으로 만들기 Build-max-heap(A) 1) heap-size[A] <- length[A] (정렬할 데이터의 개수) 2) for i <- └length[a]/2┘ downto 1 3) do MAX-heapify(A,1) 시간복잡도 O(n) 정렬을 하려면 먼저 데이터로 힙을 만들어야 함. 데이터는 정렬이 되어지지 않은 상태고 이걸로 complete binary tree를 맨들어서 heap으로 변경해야 함. 힙은 정렬에 있어서 매우 유리한 점이 있는데 MAX힙은 부모는 자식보다 크다는 것이므로 전체 트리 중 최대값은 반드시 root이다! Heapsort 1. - 주어진 데이터로 힙을 만든다 2. - 힙에서 최대값(루트)를 가장 마지막 값과 바꾼다 3. - 힙의 크기가 1 줄어든 것으로 간주한다. 즉, 가장 마지막 값은 힙의 일부가 아닌 것으로 간주한다. 4. - 루트 노드에 대해서 HEAPIFY(1) 한다. 5. - 2~4번을 반복한다. HEAPSORT(A) 1. BUILD-MAX-HEAP(A)                : O(n) 2. for i <- heap_size downto 2 do     : n-1 times 3. exchange A[1] <-> A[i]                    : O(1) 4. heap_size <- heap_size -1               : O(1) 5. MAX-HEAPFIY(A,1)                    :O(log2n) TOTAL TIME : O(nlog2n)

개발 공부 - WIndows 7 간단하게 컴퓨터 예약 종료하기

WIndows 7 간단하게 컴퓨터 예약 종료하기 shutdown 명령어를 이용하면 된다. 시작 -> 실행 하고, shutdown /s /f /t 3600 라고 타이핑 해주면 된다. /s 는 종료한다는 의미고, 대신 /r 이나 /l 을 붙이면 재부팅 하거나 로그오프 한다.  /t 뒤에 붙는 3600 은 한시간 예약을 말한다. 적당히 알아서 조절하면 되겟다. 1초단위이며, 최대 예약 시간은 10년이다. (315360000!!) /f 는 만약 강제 종료가 필요할 대 사용한다. 대화상자가 나와서 종료가 되지 않는 경우 등... 조금 더 많은 옵션을 보고 싶으면 커맨드라인에서 shutdown이라고만 쳐보면 자세한 명령어가 나오니 참조. 만약에 다른 볼일이 생각나서 예약해 놓은 자동꺼짐을 취소하고 싶을 경우에는 shutdown /a 라고 쳐주면 중단한다.  출처 : http://talkable.egloos.com/1674594

개발 공부 - [정렬] 힙 정렬(heap sort) -2 (Section 3)

(1과 이어서 강의) 만약에 루트만 힙 조건을 만족하지 않을 경우, 조건을 만족시키기 위해 자식들 중 더 큰 쪽이 루트보다 크면 교환한다. 그런 식으로 밑까지 내려 보냄. 요렇게 heap 조건을 만족시키는 이진 트리로 만듬.  MAX-HEAPIFY : recursive version MAX-HEAPIFY(A, i) // 노드 i를 루트로 하는 서브트리를 heapify 한다. {     if there is no child of A[i]          return;     k <- index of the biggest child of i;     if A[i] ≥ A[k]          return;     exchange A[i] and A[k];     MAX-HEAPIFY(A, k); } //root 노드에 대한 heapify는 MAX-HEAPIFY(1)을 호출하면 됨 이거를 iterative version으로 변경도 가능하다. MAX-HEAPIFY(A, i) {     while A[i] has a child do     k <- index of the biggest child of i;     if A[i]  ≥ A[k]          return;     exchange A[i] and A[k];     i = k; end. } 이거는 시간 복잡도를 생각해 보면 트리 높이(h) 보다 더 크게 걸릴 수는 없으므로 O(h) - complete binary 트리이므로 노드 수는 n h = O(logn) 에서 약간 오차 있는 정도로 적용된다.

개발 공부 - [정렬] 힙 정렬(heap sort) -1 (Section 3)

 Heap과 Heapsort - 최악의 경우 시간복잡도 O(nlog2n) - Sorts in place - 추가 배열 불필요 (mergesort와 다르다!) - 이진 힙(binary heap) 자료구조를 사용 Heap은  1) complete binary tree  2) heap property 를 만족  max heap property : 부모는 자식보다 크거나 같다 = 위에 노드의 값이 더 커야 한다. min heap property : 부모는 자식보다 작거나 같다 트리는 계층적 관계를 표기하기 위해서 사용 이진트리는 한 부모가 두개의 자식을 가지고 있는 것 full binary tree : 모든 레벨에 노드들이 꽉 차 있어야 함 (단일 노드만 있어도 풀 바이너리 트리이다!) complete binary tree : 마지막 레벨을 제외하면 완전히 차 있고, 마지막 레벨에는 가장 오른쪽부터 연속된 몇 개 노드가 비어있을 수 있음. (이거는 왼쪽은 거진 메꿔져 있어야 정상.) 동일한 데이터를 가지더라도 서로 다른 모양의 힙일 수 있다. (힙 조건만 만족하면 데이터 위치는 중요하지 않음) 힙은 일차원 배열로 표현가능하다. A[1...n] 루트 노드 A[1]. A[i]의 부모 = A[i/2] A[i]의 왼쪽 자식 = A[2i] A[i]의 오른쪽 자식 = A[2i + 1] 1의 왼쪽 자식은 2 1의 오른쪽 자식은 3 2의 부모는 1 3의 부모는 1 이런 식으로 계산 가능하다. Heap을 이용해서 정렬을 하기 위한 기본 연산 :  Max Heapify : 전체를 힙으로 만들어라. - 트리의 전체 모양이 complete binary tree여야 한다. 유일하게 루트만이 heap property를 만족하지 않음. (부모가 없으니까) - 왼쪽 subtree는 그 자체로 heap이고,  - 오른쪽 subtree도 그 자체로 heap일 때!! 만약에 루트만 힙 조건을 만족하지 않을 경우, 조건을 만족시키기 위해 자식들 중 더 큰 쪽이 루트보다 크면 교환한다. 그런 식으로 밑까

개발 공부 - [컴퓨터과학] 알고리즘 - 알고리즘이란?

https://ko.khanacademy.org/computing/computer-science 알고리즘 순서대로 듣기로 했다. 알고리즘 : 어떤 문제를 해결하기 위한 절차의 집합이라고 정의할 수 있다. 컴퓨터 과학 - 컴퓨터 프로그램이 어떤 문제를 해결하기 위해 필요한 명령어들의 집합 추측 게임 (1~16까지 무작위로 선택된 것을 맞추는 것)  - 선형 검색의 경우 1부터 16까지 순서대로 눌러 봄 (확실하나 확률이 낮다)  - 이진 탐색 (남아있는 숫자의 절반을 계속 제외 - 4번 안에 성공 - 수학적으로 설명 가능) 1~16 = 2^4 = 4번 안에 가능 1~512 = 2^9 = 9번 안에 가능 경로 찾기  - 목표 지점에서 목표 지점까지 떨어진 단계를 숫자로 계산해서 제일 짧은 거리를 도출 가능

개발 공부 - PC 카카오톡 작업 표시줄 아이콘 이미지 변경 방법

PC 카카오톡 사용시 작업 표시줄에서 아이콘 이미지를 변경하는 방법이다. 1) 작업 표시줄 내 카카오톡 아이콘에서 마우스 오른쪽 버튼을 누른  뒤 속성에 들어간다. 2) 아이콘 변경에서  C:\Windows\system32\imageres.dll C:\Windows\system32\shell32.dll C:\Windows\system32\DDORes.dll C:\Windows\System32\moricons.dll (MS DOS Icons) 등을 누른 뒤 적당한 것을 선택하여 적용한다. * 사내 메신저 아이콘을 참고해도 된다. 참고 : 기본 아이콘 위치 https://blog.silnex.kr/windowstip-windows-%EA%B8%B0%EB%B3%B8-%EC%95%84%EC%9D%B4%EC%BD%98-%EC%9C%84%EC%B9%98/ 2022. 11. 29.  생각보다 유입이 많아서 놀랐습니다. PC 카톡 사용자 화이팅!

개발 공부 - 윈도우 창 투명하게 만들어 주는 프로그램

사실 사내 메신저 하려고 찾은 윈도우 창 투명하게 만들어 주는 프로그램이다. 투명도 설정 후 십자 버튼 떨구면 정상 동작함. 개발자 지원이 끝난듯 하나 제품은 잘 동작해서 잘 씁니다. 감사합니다 :-) 다운로드 링크는 blogger라 드라이브에 올려 놓은 것 공유 (문제시 삭제)  출처 : https://cezacx2.tistory.com/1023

개발 공부 - [정렬] 빠른정렬(quick sort) (Section 3)

 분할정복법 분할 : 배열이 다음과 같은 조건이 만족되도록 두 부분으로 나눈다.           lower part  의 element ≤ upper part의 element           피봇보다 작은 값 <<<<  피봇보다 큰 값 정복 : 각 부분을 순환 정렬한다. 합병 : 암것도 할게 없다 예시로 n개의 데이터를 피봇으로 선정 한 뒤 피봇보다 작은 값 <<<< 피봇 >>> 피봇보다 큰 값 이런 식으로 정렬한다. 그래서 1/2n개 이런 식으로 나눠지진 않음 n = n-1 + o n = o + n-1 이런 식으로 균일하지 않게 나눠질 수 있음. Quicksort - 정렬한 배열이 주어짐. 마지막 수를 기준(pivot)으로 삼는다. - 기준보다 작은 수는 기준의 왼쪽에, 나머지는 기준의 오른쪽에 오도록 재배치(분할)한다. - 기준의 왼쪽과 오른쪽을 각각 순환적으로 정렬한다. (정렬 완료) 따라서 여기서는 분할 시에 partition 이 중요하다! 수도 코드   quicksort(A[], p, r){     if(p<r) then{          //q가 피봇의 위치임          q = partition(A, p, r); //분할          quicksort(A, p, q-1); //왼쪽 부분배열 정렬          quicksort(A, q+1, r); //오른쪽 부분배열 정렬      } } partition(A[], p,r){     배열 A[p...r]의 원소들을 A[r] 기준으로 양쪽으로 재배치하고     A[r]이 자리한 위치를 return 한다.     if        A[j]≥x               j <- j+1;     else               i <- i + 1;          exchange A[i] and A[j];          j <- j+1;        } 파티션을 하기 위해서 무조건 피벗하고 비교를 하는 작업이

개발 공부 - 윈도우 cmd 에서 하위폴더에 있는 모든 파일을 복사하는 명령어

하위폴더에 있는 모든 파일들만(디렉토리 제외) 복사하는 명령 문구는 cmd창을 열고 cd 상위폴더(하위 폴더에 파일 옮길 것) for /r %i in (*.*) do xcopy /y "%i" 이동할경로\ 입력하면 원본은 두고 지정한 폴더의 하위 폴더 내 내용이 복사된다.

개발 공부 - [정렬] 합병정렬(merge sort) (Section 3)

 분할정복법 merge sort quick sort = 분할 정복법 heap sort 분할 : 해결하고자 하는 문제를 작은 크기의 동일한 문제들로 분할          [더 작은 크기의 동일한 문제로 분할해야 한다] 정복 : 각각의 작은 문제를 순환적으로 해결 합병 : 작은 문제의 해를 합하여(merge) 원래 문제에 대한 해를 구함 합병정렬(merge sort) 분할 divide - 데이터가 저장된 배열을 절반으로 나눔 정복 recursively sort - 각각을 순환적으로 정렬 합병 merge - 정렬된 두 개의 배열을 합쳐 전체를 정렬 나누고 - 정렬하고 - 합치고 반복 제일 중요한 것이 merge 인데 이미 정렬된 두 개의 배열이 있을 경우 i와 j를 합치기 위해서는 추가적인 배열 k를 생성해서  i의 [0] 과 j의 [0] 중 가장 작은 값을 k의 [0]에 두고 (만약 i[0]이 j[0]보다 작다면) i의 [1] 과 j의 [0] 중 가장 작은 값을 k의 [1]에 두고 ... 이런 식으로 정렬을 한다. 만약 i 배열이 j 배열보다 먼저 완료될 경우에는 j의 나머지를 k에 붙인다. 수도코드 mergesort(A[], p, r) {                    //A[p...r] 을 정렬한다     if (p<r) then{          q <- (p+q)/2;                         ...1) p,q의 중간 지점 계산          mergesort(A, p, q);               ...2) 전반부 정렬          mergesort(A, q+1, r);            ...3) 후반부 정렬          merge(A, p, q, r);                   ...4) 합병      } } merge(A[], p, q, r){     정렬되어 있는 두 배열 A[p...q]와 A[q+1...r]을 합하여     정렬된 하나의 배열 A[p...r]을 만든다. } 코드 void mer

개발 공부 - 브라우저 integrity(무결성) 코드 추가

웹에 올라가는 소스에 무결성을 적용하는 법은 <script src="temporary.js?v=1" integrity="sha256-NJEVSSJ+/tb+io5r/yBkjn82KxrBsPDKobv91/cBgWc="></script> 이렇게 기재한 뒤에 (version은 추후 변경해도 상관없다) Failed to find a valid digest in the 'integrity' attribute for resource '경로/temporary.js?v=1' with computed SHA-256 integrity 'gkOpuIiZJJA+QaPuUiWdPzNZypQrkB8g3OKXuGIfSuM='. The resource has been blocked. 크롬에서 console 창에 알려주는 integrity를 적용한다. 이거 참조로 더 보고 싶으면 SRI (Subresource Integrity) - https://w3c.github.io/webappsec-subresource-integrity/ 참조하면 된다. sha-2 sha-256 sha-384 sha-512 이렇게 sha2 중 384나 512도 지원한다.

개발 공부 - 윈도우에 레드마인 설치시 맨 처음 화면 수정

초기 화면 수정은 C:\Bitnami\redmine-4.1.0-0\apps\redmine\htdocs\config 에 있는 routes.rb 파일 내에 있는 내용을 변경하면 된다.   # root :to => 'welcome#index', :as => 'home'   root :to => 'my#page', :via => :get, :as => 'home' 이러면 my/page (내 페이지)로 초기 화면이 설정된다. 참고: https://rapperwoo.tistory.com/m/177?category=173482 https://community.bitnami.com/t/bitnami-redmine-change-port/24581/3

개발 공부 - 윈도우에 레드마인 설치 시 중복된 포트 변경 방법

 기존에 설치된 프로그램이 443 포트를 사용하기 때문에 redmine 포트를 변경했다. Bitnami redmine을 설치했으므로 C:\Bitnami\redmine-4.1.0-0\apache2\conf 내의 httpd.conf와 bitnami\httpd.conf 내 정보를 변경했다. 80 -> 8090 443 -> 2443 conf 내의 header의 정보도 같이 바꿔줘야 정상 동작한다. 주석을 제외한 다른 포트 정보도 전체 바꿔줘야 한다. 참고 :  https://rapperwoo.tistory.com/m/177?category=173482 https://community.bitnami.com/t/bitnami-redmine-change-port/24581/3

개발 공부 - [정렬] 기본적인 정렬 알고리즘 (Section 3)

201012: 정렬 1) 정렬 알고리즘 : - Simple, slow (기본적이나 속도 느림) Bubble sort Insertion sort Selection sort -Fast (상대적으로 빠름) Quick sort Merge sort Heap sort - O(N) Radix sort  (1) Selection sort 전체 중 제일 큰 값을 찾아서 맨 뒤 것과 자리를 바꾼 뒤  전체-1 중 제일 큰 값을 찾아서 맨 뒤-1 것과 자리를 바꾼 뒤 ... (반복) = 데이터를 오름차순으로 정렬 수도 코드 : selectionSort(A[], n) { // 배열 A[1...n]을 정렬한다.     for last <- n downto 2 {                                         ... 1)          A[1...last] 중 가장 큰 수 A[k]를 찾는다;              ... 2)          A[k] <-> A[last]; // A[k]와 A[last]의 값을 교환  ... 3)      } } 실행 시간: 1) 의 for 루프는 n-1번 반복 2) 에서 가장 큰 수를 찾기 위한 비교 횟수 : n-1, n-2, ... , 2, 1 3) 의 교환은 상수시간 작업 시간복잡도 T(n) = (n-1)+(n-2)+...+2+1 = O(n^2) (2) Bubble sort Selection Sort와 유사하나 맨앞 2개씩부터 옮겨가는 구조임 0-1 비교 후 큰 것 1으로 변경 1-2 비교 후 큰 것 2로 변경 이런 식으로 전체 교환 수도 코드 :  bubblesort(A[], n){     //배열 A[1...n]을 정렬한다.     for last <- n downto 2 {               ... 1)           for i <- 1 to last - 1               ... 2)          if (A[i] > A[i+1]) then A[i] <-

개발 공부 - [알고리즘] Recursion (순환) (Section 2)

https://www.inflearn.com/course/알고리즘-강좌/dashboard 강좌 내용 공부