C42 string.h_strcat, strncat_문자열 합치기 (구현식 포함) [ strcat ] arguments로 제공된 두 문자열을 합쳐줌 (앞 문자열에 뒷 문자열 내용을 추가함) 원본 문자열은 추가 문자열을 포함할만큼의 충분한 공간을 확보하고 있어야 함 공간이 부족할 경우 에러 발생 [ strncat ] 추가 문자열, 정확히는 char 타입 배열에서 가져올 바이트 수를 지정해줌 구현식은 아래와 같습니다. 실제 코드는 아니고 직접 짜본 코드입니다. 간단한 코드입니다. [ strcat ] #include #include void MyStrcat(char str[], char str2[]); int main() { char str[15] = "Hello "; char str2[] = "Wolrd..!"; strcat(str, str2); printf("%s\n", str); //.. ▸C언어/기본함수 및 구현식 2020. 1. 15. string.h_strlen_문자열 길이 구하기 (구현식 포함) [ strlen ] 문자열의 길이를 구해줌 정확히는 char 타입 배열의 크기(바이트)를 구해줌 한글의 경우 2바이트 문자이기 때문에 한글자의 값이 2가 됨 구현식은 아래와 같습니다. 간단한 코드로 구현 가능합니다. #include #include int MyStrlen(char str[]); int main() { char str[] = "Hello World..!"; char str2[] = "가나다"; printf("%d\n", strlen(str)); // 14 printf("%d\n", MyStrlen(str)); // 14 printf("%d\n", strlen(str2)); // 6 printf("%d\n", strlen(str2)); // 6 return 0; } /* strlen */ /.. ▸C언어/기본함수 및 구현식 2020. 1. 15. 객체지향 언어의 특징(추상화) [1/4] 그럼 객체지향언어가 가지고 있는 대표적인 특징을 기준으로 C언어와 Java를 비교해보겠습니다. 1. 추상화 (Abstract) 중요한 정보만을 표현함으로써 공통의 속성이나 기능을 묶어 이름을 붙이는 것 Java에서는 하나의 객체를 추상화하여 클래스를 만든다고 표현함 C언어에서는 구조체가 Java의 클래스에 가장 가까운 개념입니다. 어떠한 목적에 필요한 타입이 다른 여러 변수를 하나의 구조체에 묶어서 정의해둠으로써, 필요할 때 그 구조 전체를 가져다 쓰는 것이죠. 사실 변수들을 각자 따로 만들어서 써도 무방하지만 구조체를 이용하면 보다 직관적으로 데이터 구조를 확인하고 사용할 수 있습니다. 이 개념이 확장되어 발전된 것이 객체이며 Java의 클래스라고 볼 수 있습니다. 같은 구조의 정보를 담는 변수.. ▸JAVA/기본 상식 2019. 12. 9. 백준알고리즘_2751_정렬 (힙정렬) (C언어) 사실 시간 복잡도 O(nlogN)의 알고리즘은 기초알고리즘 게시판에서 다 정리했지만.. 혹시 까먹었을까 싶어 한 번 풀어봤습니다. 오랜만에 짜봐서 그런지 또 시간이 꽤 걸렸네요. ㅎㅎ 시간 복잡도를 낮추려면 병합정렬, 퀵정렬, 힙정렬 세 가지 중 하나를 사용하면 됩니다. 저는 제일 좋아하는 힙정렬을 사용했습니다. 알고리즘 설명은 아래 링크글에 있습니다. 2019/12/09 - [C언어/알고리즘 및 자료구조] - 정렬알고리즘_힙 정렬 [6/8] #include #include void heap(int* arr, int n); void swap(int* arr, int x, int y); int main() { // 배열 생성, 스택에 담기엔 너무 크다고 에러나서 동적 할당 int* arr = (int*)m.. ▸알고리즘 문제 풀이 2019. 12. 9. 백준알고리즘_10870_재귀함수_피보나치수열 (C언어) 자바 공부하다가 머리가 아파서 잠시 머리도 식힐겸 알고리즘으로 돌아와서 C를.. 자바의 객체 개념은 정말 어렵네요. 외울 것도 많고.. 재귀함수 버전 피보나치 수열은 재귀함수 입문용인데 의외로 인터넷 보면 어마어마한 성능을 요구하는 재귀함수를 정답이라고 올려두신 분들이 많은 듯 합니다.. 기본적으로 피보나치 수열 공식이 "f(n) = f(n-1) + f(n-2)" 이라고 아래와 같이 그대로 재귀함수 코드를 짰다가는 컴퓨터한테 혼납니다. 컴퓨터 성능에 따라 다르겠지만 대략 제 컴퓨터에서는 35이상 넘어가면 연산 시간이 1초를 넘어가네요. #include int pivo(int num); int main() { int num; scanf("%d", &num); printf("%d", pivo(num + .. ▸알고리즘 문제 풀이 2019. 12. 9. 백준알고리즘_11729_재귀함수_하노이탑 이동 (C언어) 처음 풀어본 알고리즘 문제인데 이틀이 꼬박 걸렸습니다. 그런데 모범답안보니 너무 간단하네요. ㅠ 하노이탑 이동 원리를 아는 것 자체는 사실 무의미하지만 이 문제를 푸는 사고 과정 자체가 확립 되는 것이 중요할 것 같습니다. 머리 좋은 사람 참 많네요. 전 모범답안 보고도 한참 헤맸는데.. 재귀함수가 모두 그렇듯, 키 포인트는 함수 자체가 계속 부분집합으로 발생했다 없어지는 방식이라는 것입니다. 일반적인 사고 방식과 같이(저처럼..) 전체를 보면서 풀어나가면 답이 없습니다. 제가 이틀 걸려 짠 코드는 가장 아랫쪽에 남겨둡니다. 흑역사네요. 간단히 3개짜리 원판 옮기기 구조만 보면 나머지는 로직만 주고 컴퓨터에게 맡길 수 있습니다. 실제로 원판이 7개쯤 되면 손으로 그리기도 힘듭니다. 세 개짜리 원판에서 가.. ▸알고리즘 문제 풀이 2019. 12. 9. 이분탐색(재귀함수 사용법)_값 찾기 [1/1] [ 이분탐색이란? ] 정렬된 데이터에서 특정 값을 찾을 때, 하나하나 찾는것이 아니라 범위를 좁혀나가며 찾는 방법 O(logN)의 시간 복잡도가 소요되어 정렬되어 있는 데이터를 보다 빠르게 검색 가능 이미 정렬이 되어 있다는 것은 처음부터 찾아나가는 것 보다 더 효율적인 탐색 방법이 항상 존재합니다. 그 중 가장 간단한 방법인 이분 탐색을 해도 해도 항상 헷갈리는 재귀함수 사용법과 함께 정리해봅니다. 먼저 정렬된 데이터가 있습니다. size를 구하고 찾을 데이터를 입력합니다. 배열에서 범위를 지정할 때는 대부분 size를 사용하는 것이 편합니다. 예를 들어 10개가 있으면 배열의 마지막 인덱스는 9이지만 총 10개라 size는 10이 됩니다. int arr[] = { 1,2,5,7,11,15,22,38,.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 이분매칭_작업 할당하기[1/1] [ 이분 매칭이란? ] 1:1 매칭 개념으로 하나의 노드에 하나만 효율적으로 할당하는 방법 기본 1:1 매칭이지만 조금 고치면 특정 노드는 2:1매칭 등으로 수정 가능 응용하기 나름 예를 들어 실생활에서 여러 개의 희망 사항을 모아서 가장 효율적으로 배분하는 방법이라고 볼 수 있습니다. 청소 구역 신청을 예로 들어보겠습니다. 아래와 같이 학생들이 각자 희망하는 청소구역을 여러개 적어서 냈을 때, 가장 효율적으로 배분하는 방법입니다. 몇 명 안되면 손으로 하면 되는데 학생수가 많으면 손으로 하기보단 코딩해서 뽑아내는게 더 빠르겠네요. 간단히 방법론에 대해 설명하자면 아래와 같은 과정을 통해 진행됩니다. 위 로직을 그대로 코드로 옮기면 됩니다. 다들 C++로 짜는지라 저 편한대로 C로 구현해봅니다. 입력 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 문자열 찾기(매칭)_라빈 카프 알고리즘 [2/2] [ 라빈 카프 알고리즘이란? ] 찾을 문자열을 해쉬(hash)값으로 변환하여 문자열을 찾음 ※ 해쉬(해시, hash) - 특정 규칙을 이용해 데이터를 하나의 값으로 변경한 값을 의미 - 데이터의 일부분만 바껴도 해쉬값이 변경됨 - 낮은 확률로 다른 데이터가 같은 해쉬값으로 표현될 수도 있음 - 해쉬의 중복 확률이 낮을 수록 좋은 규칙이라고 할 수 있음 예를 들어 이번 라빈 카프 알고리즘에서 사용할 가장 간단한 해쉬값은 아래와 같이 만들 수 있습니다. "각 문자의 아스키코드"에 "2^자릿수" 를 곱해주고 그 합을 해쉬값으로 지정해주는 방식입니다. 현재 "abab"의 해쉬값은 1,465입니다. 중간에 문자가 하나 바뀌거나 같은 문자라도 자릿수가 다르면 모두 다른 값이 되는 것을 알 수 있습니다. 문자가 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 문자열 찾기(매칭)_KMP알고리즘 [1/2] [ KMP 알고리즘이란? ] 문자열의 가장 앞부분과 동일한 문자열 정보를 배열로 만들어 효율성을 검색의 높이는 방법 모두 다른 문자로 이루어진 문자라 하더라도 검색 효율성이 더 높음 개념 이해가 잘 안돼서 한참 고민했습니다. 사전에 유의해야 할 사항은 만약 "ababab"라는 문자열에서 "abab"를 찾는다고 했을 때, 2개가 검색이 돼야 한다는 점입니다. 하나만 검색되면 틀린 로직입니다. [ 일반 로직 ] 일반적인 로직 입니다. 먼저 첫 글자가 같으면 비교를 시작합니다. 끝까지 같지 않고 다른 글자가 나오면 다시 앞으로 이동해서 반복합니다. 만약 여기서 i가 그 자리에서 계속 전진만 하면 아까 "ababab"에서 "abab"를 찾을 경우 처음 네 글자 하나밖에 찾을 수가 없게 됩니다. 따라서 i의 위.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 위상 정렬 [1/1] [ 위상 정렬이란? ] 순서가 정해져 있는 작업을 차례대로 수행 우선순위가 동일한 작업 사이에서는 순서가 상관 없음 무한 루프 구조가 되면 안됨 (두 작업이 서로의 선행 조건이 되는 경우) 해당 작업 전에 할당된 작업이 있다면 그 작업들부터 끝내고 해당 작업을 진행한다는 의미입니다. "밥을 차린다 → 밥을 먹는다(반찬은 순서에 상관없이 먹는다) → 설거지를 한다(그릇은 순서에 상관없이 씻는다)" 의 과정과 같습니다. 순서에 상관 없는 과정도 있고, 꼭 순서가 필요한 과정도 있습니다. 이 중, 순서가 꼭 필요한 부분들을 정렬해주는 알고리즘이라고 볼 수 있습니다. 간단히 아래 그림과 같이, 4,2는 1이 수행된 이후에, 3은 4,2가 수행된 이후에 작업될 수 있습니다. 복잡한 그래프에서 이 순서를 파악.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 플로이드 와샬 알고리즘_최단경로 길찾기 [1/1] [ 플로이드 와샬 알고리즘이란? ] 다익스트라 알고리즘의 반복 수행과 동일한 결과 모든 도시를 ROOT로 뒀을 때의 결과를 다익스트라보다 더 효율적으로 구할 수 있음 기본적으로 다익스트라 알고리즘에서 모든 ROOT 도시에 대한 최단 거리를 구하기 위해 조금 수정됐다고 볼 수 있습니다. 다익스트라는 출발도시를 기준으로 하고, 플로이드 와샬은 거쳐가는 도시를 기준으로 한다고 되어 있지만, 사실 다익스트라도 거쳐가는 도시를 기준으로 하고 있습니다. 다만 거쳐가는 도시를 탐색할 순서를 "루트도시를 기준으로 아직 방문하지 않은 최단 거리 도시"로 선정해서 수행하는 거죠. 즉 다익스트라에서도 1번을 거쳤을 때 다른 도시로 갈 수 있는 거리, 2번을 거쳤을 때, 6번을 거쳤을 때... 로 순서를 지정해 줘서 다른 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 다익스트라 알고리즘_최단경로 길찾기 [1/1] [ 다익스트라 알고리즘이란? ] 다이나믹 알고리즘을 이용하여 최단 거리를 탐색하는 알고리즘 ROOT 도시에서 다른 도시로 가는 최단 경로를 탐색 강의 안듣고 하다가 개념을 헷갈려서 한참 헤맸네요. 크루스칼 알고리즘이랑 같은 결과는 내는 건줄 알았는데 다른 알고리즘이었습니다. 크루스칼 알고리즘이 전체 경로를 최단 거리로 만들어주는 것이라면, 다익스트라 알고리즘은 ROOT 도시에서 각 도시로 가는 최단 경로를 탐색하는 알고리즘입니다. 즉, 크루스칼보다 다익스트라의 결과값이 더 크게 나올 수 있게 됩니다. 예를 들어 아래 그림에서 0번 도시에서 5번 도시로 가는 경우 다익스트라 알고리즘에서는 가장 짧은 거리인 0-1-5 입니다. 하지만 크루스칼에서는 전체 경로의 효율성을 고려하여 0-1-6-5의 경로를 .. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 에라토스테네스의 체_소수 찾기 [1/1] [ 에라토스테네스의 체란? ] 소수를 구하는 빠른 방법의 알고리즘 일반적인 방법 : 해당 숫자를 (2 ~ 해당숫자 -1)번째 수로 차례대로 나눠봄 에라토스테네스의 체 : (2 ~ 해당숫자)범위 숫자에서 배수를 모두 지우고 남는 숫자가 소수 범위 내 소수를 모두 구할 때 효율적인 방법 즉 일반적인 방법이 다 나눠보는거라면, 에라토스테네스의 체는 범위 내 숫자의 배수를 모두 지워서 남는 것을 소수로 판단하는 알고리즘입니다. 일단 알고리즘을 배우기 전에 일반적인 코드로 소수를 구해보겠습니다. 사실 이 코드도 매우 간단한데 연산 횟수상에서는 해당 알고리즘에 불리합니다. #include #define SIZE 50 void main() { for (int i = 1; i ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 다이나믹 알고리즘_타일 채우기 [2/2] 이번에는 타일이 늘었습니다. 이전글은 1*2 / 2*1 두 개의 타일이 있었는데 이번에는 2*2 타일로 추가해보라고 하네요. 과제는 유투브 '동빈나'님의 알고리즘 강의를 참고했습니다. 별로 달라지는 건 없는 것 같습니다. 수열의 규칙이 바꼈을 뿐.. 규칙을 달리해서 수열을 전개해보라는 걸까요. 일단 이전글처럼 일반 반복문, 재귀함수 버전으로 한 번 작성해보겠습니다. 제가 뭔가를 잘 못 생각하고 있는걸까요.. 아무리 고민해봐도 수식에서 숫자 1개 추가하고 1개 바꿔주는 것 외에는 달라지는게 안보이는데 흠.. 일단 미심쩍으므로 재귀함수 버전만 짜보고 강의를 들어보겠습니다. 굳이 값을 리턴해야하는 경우가 아니라면 재귀함수에서는 그냥 void함수로 사용하고 포인터를 써서 특정 변수들을 바꿔주는 방식이 더 편.. ▸C언어/알고리즘 및 자료구조 2019. 12. 9. 이전 1 2 3 다음 💲 추천 글 반응형