전체 글 280

27. N!의 표현법

이 문제의 저작권은 인프런 강의 "it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비" 에 있습니다. 문제 25 임의의 N에 대하여 N!은 1부터 N까지의 곱을 의미한다. 이는 N이 커짐에 따라 급격하게 커진 다. 이러한 큰 수를 표현하는 방법으로 소수들의 곱으로 표현하는 방법이 있다. 먼저 소수는 2, 3, 5, 7, 11, 13... 순으로 증가함을 알아야 한다. 예를 들면 825는 (0 1 2 0 1)로 표현이 가능한데, 이는 2는 없고 3은 1번, 5는 2번, 7은 없고, 11은 1번의 곱이라는 의미이다. 101보 다 작은 임의의 N에 대하여 N 팩토리얼을 이와 같은 표기법으로 변환하는 프로그램을 작성해 보자. 출력은 아래 예제와 같이 하도록 한다. 입력설명 첫 줄에 자..

전화번호부 v3.0 - 배열 재할당, 라인단위 입력과 문자열 tokenizing

포인터는 변수의 주소를 가리키는 또 다른 변수라 생각하면된다. 그래서 포인터라고도 하지만 포인터 '변수'라고도 불리운다. 주소를 가리킨다는 말은 실제로는 포인터는 대상체의 주소값을 지닌다는 말이다. 이중 포인터란 그럼 포인터도 일종의 변수기 때문에, 포인터를 가리키는 포인터도 존재한다. 이를 이중 포인터라고 한다. 그런데 이런 이중 포인터의 선언 타입은 첫번째 포인터의 선언 타입을 따라간다. 결국 이중포인터도 최초의 변수 즉 최종 대상체가 되는 값의 타입을 기준으로 선언 되는 것이다. int a = 7; int *p1; int **p2; p1 = &a; p2 = &p1; printf("%d ", *p1); printf("%d", **p2); 출력 결과는 7 7 이 나온다. 2021.06.19 - [자료구..

💡 자료구조 2021.06.22

전화번호부 v2.0 - 파일을 저장하고 로드하기, 알파벳 순으로 정렬

2021.06.19 - [자료구조] - 전화번호부 v1.0 전화번호부 v1.0 오늘은 권오흠 교수님께서 전화번호부를 만드는 예제를 가르쳐주셨다. 여태까지 배웠던 C언어의 기초를 응용해서 전화번호부 예제를 만들 수 있었다. void add() { char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; ts2ree.tistory.com 이전과 다른 점은 파일을 저장하고 로드하며, 전화번호부는 알파벳 순으로 정렬되어야 한다. 전화번호부 v2.0는 파일을 저장하고 로드하기 위한 load 함수와, save 함수가 추가되었다. 나머지 함수의 변화는 밑에서 살펴볼 것이다. void load() { // command = read char fileName[BUFFER_SIZE]; char buf1..

💡 자료구조 2021.06.19

전화번호부 v1.0

오늘은 권오흠 교수님께서 전화번호부를 만드는 예제를 가르쳐주셨다. 여태까지 배웠던 C언어의 기초를 응용해서 전화번호부 예제를 만들 수 있었다. void add() { char buf1[BUFFER_SIZE], buf2[BUFFER_SIZE]; scanf("%s", buf1); scanf("%s", buf2); names[n] = strdup(buf1); // strdup 와 strcpy 차이는? numbers[n] = strdup(buf2); n++; printf("%s was added successfully.\n", buf1); } buf1 과 buf2 는 지역변수이기 때문에 lifetime 은 짧다. 그러므로 이 함수를 벗어나게 되면 두 변수 모두 소멸하게 된다. 그래서 strdup 를 써주어야 하..

💡 자료구조 2021.06.19

26. 말아톤

이 문제의 저작권은 인프런 강의 "it 취업을 위한 알고리즘 문제풀이 (with C/C++) : 코딩테스트 대비" 에 있습니다. 문제 25 KSEA 장거리 달리기 대회가 진행되어 모든 선수가 반환점을 넘었다. 각 선수의 입장에서 자 기보다 앞에 달리고 있는 선수들 중 평소 실력이 자기보다 좋은 선수를 남은 거리 동안 앞지 르는 것은 불가능하다. 반대로, 평소 실력이 자기보다 좋지 않은 선수가 앞에 달리고 있으면 남은 거리 동안 앞지르는 것이 가능하다. 이러한 가정 하에서 각 선수는 자신이 앞으로 얻을 수 있는 최선의 등수를 알 수 있다. 각 선수의 평소 실력은 정수로 주어지는데 더 큰 값이 더 좋은 실력을 의미한다. 현재 달리고 있는 선수를 앞에서 부터 표시했을 때 평소 실력이 각각 2, 8, 10, 7..

문자열 예제

#include int main() { char buffer[40]; while (1) { printf("$ "); scanf("%s", buffer); printf("%s: %d\n", buffer, strlen(buffer)); } return 0; } 이 코드의 문제점은 scanf("%s", buffer) 부분에서 발생하는데, scanf("%s", ...) 는 공백을 기준으로 다른 단어로 인식한다. 그래서 gets() 라는 함수를 떠올려볼 수 있으나 gets() 함수는 안전하지 않다. 안전하지 않다는 것이 무슨 의미냐하면 buffer 길이를 40으로 제한했음에도 불구하고 40을 넘는 길이의 문자열을 입력했을 때, 그대로 실행이 되면서 40이 넘는 길이를 카운트해주기 때문이다. -> gets() 함수..

💡 자료구조 2021.06.18

시간 복잡도와 빅-오 표기법

"어떤 알고리즘이 어떠한 상황에서 더 빠르고 느리냐?" "어떤 알고리즘이 어떠한 상황에서 메모리를 적게 쓰고 또 많이 쓰냐?" 하나는 '속도'에 관한 것이고, 다른 하나는 '메모리의 사용량'에 관한 것이다. 이것을 수행하는 시간 분석 결과를 가리켜 앞에 것은 '시간 복잡도'라 하고, 뒤에 것은 '공간 복잡도'라 한다. 어떻게 속도를 평가할까? ① 연산의 횟수를 셉니다 ② 그리고 처리해야 할 데이터의 수 n에 대한 연산횟수의 함수 T(n) 을 구성합니다 연산의 횟수가 적어야 빠른 알고리즘이고, ②의 의미는 데이터의 수를 함수에 입력하면 연산의 횟수가 바로 계산이 되는 식을 구성한다는 뜻이다. 그 식은 책에 그림이 있는데 지수나 로그함수 식의 형태 같은 것들이다. 데이터 수의 변화에 따른 연산횟수의 변화 정..

💡 자료구조 2021.06.17

스터디 1일차

1강 sorting의 종류 - heap sort, quick sort, merse sort stable한 알고리즘은 merge sort이 있고, unstable한 알고리즘은 quick sort, heap sort가 있다. (퀵힙은 불안정) ABC 로 테이블이 있을 때, 정렬한 후에도 ABC 이 순서로 유지된다면 stable 알고리즘이다. (잘못 이해했음. 아래에 부가 설명 참고!) search는 배열을 전부 다 돌아야 하기 때문에 O(n) 정도로 걸린다 binary search -> O(logn) 2차원 다차원 array.. 먼저 정렬 알고리즘이란 컴퓨터 과학과 수학에서 정렬 알고리즘(sorting algorithm)이란 원소들을 번호순이나 사전 순서와 같이 일정한 순서대로 열거하는 알고리즘이다. (출처..

문자열

char str[6]; str[0] = 'h'; str[1] = 'e'; str[2] = 'l'; str[3] = 'l'; str[4] = 'o'; str[5] = '/0' /* C언어는 문자열을 생성하는 편리한 방법을 제공 - 2가지 */ char str[] = "hello"; //혹은 char *str = "hello"; null character('\0')는 문자열의 끝을 표시하는 역할을 한다. 즉, 배열의 크기가 문자열의 길이보다 적어도 1만큼 길어야 한다. 하지만 C언어는 배열의 각 칸마다 문자 하나씩 저장되는 방법말고도 문자열을 생성하는 편리한 방법을 제공해주는데 바로, 겹따옴표(" ")를 사용하는 방법이다. char str[] = "hello"; ------① char *str = "hell..

💡 자료구조 2021.06.16

동적할당 malloc 함수

int *p; p = (int *)malloc(40); if ( p == NULL) { /* 동적 메모리 할당이 실패 */ /* 적절한 조치를 취한다. */ } p[0] = 12; p[1] = 24; *(p+2) = 36; malloc이 반환하는 주소는 원래 타입이 없는 주소(void *)이다. 정수들을 저장하기 위해서 이것을 int *로 변환한다. (반드시 필요한 건 아니다.) 할당 받을 메모리의 크기를 byte단위로 지정한다. 여기서는 10개의 정수를 저장하기 위해서 40바이트를 요청하였다. malloc으로 할당받은 메모리는 이렇게 보통의 배열처럼 사용한다. 첫번째 주소를 리턴해준다. 만약 주소를 잊어버리면 찾기 힘들기 때문에 malloc이 리턴해주는 주소를 보관할 저장소가 필요하다. 그래서 어떤 변..

💡 자료구조 2021.06.16