전체 글 19

[알고리즘][C++] 이진검색 (Binary Search)

개요이진검색(Binary Search) 알고리즘은 정렬된 배열의 중간값과 찾고자 하는 키 값을 비교하여 배열의 절반만 확인하는 과정을 반복하여 키 값이 배열에 있는지 확인하는 검색 알고리즘이다.검색을 진행하면서 생길 수 있는 경우의 수는 다음과 같다. 1. 키 값이 배열에 있을 경우 1-1. key값과 mid값이 같을 때 : "찾았습니다!" 출력 후 종료 1-2. key값이 mid값보다 클 때 : start = mid + 1 로 설정 후 함수 재호출 1-3. key값이 mid값보다 작을 때 : end = mid - 1 로 설정 후 함수 재호출 2. 키 값이 배열에 없을 경우 이러한 경우에는 배열에 원소가 한 개 남을 때까지 검색이 진행된다. 즉, 함수의 맨 처음에 배열에 원소가 한 개 남았을 때 key값..

[오류] 세그멘테이션 오류 (core dumped) 해결 방법

오류 발생 구름ide에서 병합정렬 알고리즘을 구현하다가 실행하려고 보니 다음과 같은 오류가 나타났다. 다른 플랫폼에서 코드를 실행했더니 정상적으로 작동하는 것을 확인했다. 코드에서 작동하지 않는 부분이 있는지 확인하기 위해 cout을 난사했더니 다음과 같은 부분을 발견했다. 해결 22번 줄에서 정수형 자료 i 가 제대로 선언되지 않은 것이 문제였다. 다음과 같이 수정하니까 코드가 제대로 작동하기 시작했다. 어라 애초에 저렇게 변수를 선언하면 안되나? 싶어서 간단한 코드를 만들어 돌려봤더니... #include using namespace std; int main(){ int i, j = 14; cout

코딩 팁 2023.06.05

[알고리즘][C++] 병합정렬 (Merge Sort)

개요 병합정렬 알고리즘은 배열을 하나의 원소가 될 때까지 분할하여 정렬 후 정렬된 부분 배열을 병합, 병합된 부분 배열끼리 다시 정렬 후 병합하는 과정을 반복하여 전체 배열을 정렬하는 알고리즘이다. 위의 자료와 같이 분할하고 병합하는 과정이 똑같이 반복되기 때문에 재귀함수로 구현이 가능하다. 코드 void Merge_Sort(int A[], int p, int r) { if (p < r) { int q = (p + r) / 2; Merge_Sort(A, p, q);// 분할 Merge_Sort(A, q + 1, r);// 분할 Merge(A, p, q, r);// 정렬 } } 위의 코드는 배열을 분할하고 정렬하는 함수를 재귀적으로 수행하는 Merge_Sort 함수이다. 여기서 p와 r은 정렬할 배열의 각..

[알고리즘][C++] 선택정렬 (Selection Sort)

개요 선택정렬 알고리즘은 정렬되지 않은 부분배열에서 가장 작은 원소를 찾아 알맞은 위치에 삽입하고 이를 반복하여 배열 전체를 정렬하는 알고리즘이다. 위의 자료에서 정렬된 부분배열은 빨간색, 정렬되지 않은 부분배열은 검은색으로 표시했다. 정렬되지 않은 부분배열을 순회해 가장 작은 key 값을 찾아, 알맞은 위치의 원소와 위치를 바꾼다. 이를 반복하면 전체 배열을 정렬할 수 있다. 코드 void Selection_Sort(int arr[], int size){ int key, index; for(int i=0;i

[알고리즘][문제풀이][C++] 두 이진수 더하기

문제 원소가 n개인 두 배열 A, B에 저장된 두 개의 n비트 이진수를 더하고 원소가 n+1개인 배열 C에 저장해 그 결과를 출력하라. 설계 1. 배열 A, B에 이진수를 저장하고 그 값을 더해 배열 C에 그림과 같이 저장한다. 2. 배열 C의 $ 2^{0} $ 자리부터 받아올림을 시작한다. 이때, 배열 C의 원소에 가능한 수는 0, 1, 2, 3 뿐이다. 2-1. 배열 C의 원소가 0, 1이면 continue 2-2. 배열 C의 원소가 2면 해당 인덱스의 원소값을 0으로 바꾸고, 다음 자리 + 1 2-3. 배열 C의 원소가 3이면 해당 인덱스의 원소값을 1로 바꾸고, 다음 자리 + 1 코드 두 이진수를 더한 값을 배열 C에 저장하는 코드는 다음과 같다. for(int i=0;i=0;i--){ if(C[..

[잡담] 전공분야 선택에 대한 고민

일단 나는 소프트웨어학과를 2학년 1학기까지만 다니고 입대를 한 상태이다. (현재 일병 6호봉) 1학년때는 비대면 + 교양과목을 듣느라 별 생각이 없었고, 2학년 때 본격적으로 소프트웨어 전공 분야 수업을 듣다 보니 개발에도 여러 분야가 있다는 것을 알게 되었다. 공부를 효율적으로 하는 것을 좋아하기 때문에, 되도록 전공 분야는 빠르게 정하고 싶었고, 주변 지인들에게 물어본 결과 돌아오는 대답은, "일단 뭐든 해봐라. 2학년이면 정하기 이르다." 였다. 하기야 학교에서 Python, C, C++, 자료구조만 배운 2학년이 벌써 분야를 정하기 이른 것은 맞다. 어차피 자기개발 하려고 공군에 입대한 거, 군 생활 목표를 '전공 분야 정하기'로 정했고 이 분야, 저 분야 찍먹해보기로 했다. 1번으로 찍어먹어 ..

잡담 2023.05.07

[알고리즘][C++] 삽입정렬 (Insertion Sort)

개요 삽입정렬 알고리즘은 배열의 모든 인덱스를 확인하며 차례차례 자신의 적절한 위치를 찾아 정렬하는 알고리즘이다. 위의 자료에서 정렬된 부분은 분홍색, 정렬하고자 하는 키 값은 회색으로 표시했다. 여기서 키 값은 앞의 정렬된 분홍색 부분배열의 적절한 위치에 삽입된다. 이후, 키 값은 다음 인덱스로 넘어가고 이것을 반복해 배열 전체를 돌게되면 정렬이 되는 매커니즘이다. 코드 void Insertion_Sort(int arr[], int size){ for(int j=1;j -1 && arr[i] > key){ arr[i+1] = arr[i]; i -= 1; } arr[i+1] = key; } } 함수의 매개변수로는 배열과 배열의 크기를 받는다. 배열의 0번째 인덱스는 굳이 살펴볼 필요가 없기 때문에 1번째..