본문 바로가기

알고리즘

(24)
문자열 조작 함수 직접 구현 int strLen(const char* str){ int lne = 0 ; while(*str){ //'\0' 에 의해서 while 이 끝나는 지점이 생김 ( \0 = 0 은 false이므로) len++; str++; } } int strLen2(const char* str){ int len =0 ; while ( str[len] != '\0' ){ len ++; } return len; } //둘다 '\0' 이 아닐떄까지 ++ 하고 비교해서 리턴 int strCmp ( const char *str1, const char *str2){ while( *str1 != '\0' && *str2 !='\0' ){ if( *str1 > *str2 ){ return 1; } else if( *str2> *str1..
scanf 의 문제점 컴퓨터는 입력을 받을 때 버퍼라는 것을 이용해서 입력의 처리를 효율적으로 하고 있습니다. abcd를 입력할때 a따로 b따로 c따로 입력되는것이 아니라 , abcd 를 stdin에 저장하고 마지막으로 개행문제가 입력되면 이 stdin(버퍼)에서 꺼내서 처리합니다. 그런데 scanf 는 개행문자가 나오기 직전까지 버퍼에서 읽어드린후 버퍼에서 삭제시켜 버립니다. 다음과 같은상황에 문제가 생길 수 있어요 scanf("%d", &num); stdin(버퍼(입력스트림)) 에 123\n이 들어가 있음 이게 끝나고 나면 stdin 에 123은 삭제되고 \n만 남음 scanf("%c", &charictar); // 남은 \n 때문에 여기에 입력을 치기도 전에 \n이 들어가게됨 [두번째예시] printf("문자열을 입력하..
우선순위 큐 리스트 이용 ( 삽입 O(1), 삭제 O(n)) ) 힙 이용 ( O(logn) O(logn) ) 힙이란 ? 완전 이진 트리 의 일종 [힙정렬 구현 ] #include void heapSort(vector &arr){ priority_queue h; // 가장 큰 값을 먼저 뱉게 되어있음 for ( int i =0 ; i MAX_N } 맨마지막에 넣고, 비교하면서..
Queue (배열로 원형큐만들기) 구현 #include #define MAX_N 100 int front; int rear; int queue[MAX_N]; void init(){ front =0; rear = 0; } int isEmpty(){ return (front == rear); } int isFull(){ return ( (rear+1)%MAX_N == front); } int enqueue(int value){ if (isFull()){ return 0; } else{ queue[rear ] = value; rear ++; if( rear ==MAX_N){ rear =0; } return 1; } } int dequeue(int *value){ if( isEmpty()){ return 0; }else{ *value = queue[..
스택 구현 top 은 push를 하면 값이 들어갈 곳이라고 할 수 있겟다 #include #define MAX_N 100 int top; int stack[MAX_N]; void stackInit(void){ top = 0; } int stackIsEmpty(void){ return (top =0); } int stackIsFull(void){ return (top == MAX_N); } int stackPush(int value){ if(stackIsFull()){ printf("stack overflow!"); return 0; } stack[top] = value; top++; return 1; } int stackPop(int *value){ if (stackIsEmpty()) { return 0; } to..
14600. [Pro] 성적 데이터베이스 학생과 팀과 시험점수가 있다. 학생은 mID , mTeam , m 학생은 10만명 팀은 5팀 시험점수는 1~5까지 API 는 다음과 같다. - 학생을 넣고 ( 최대 10만회 호출) - 학생을 뺴고 ( 최대 10만회 호출) - 학생의 점수를 업데이트하고 ( 최대 10만회 호출) - 특정팀의 모든 학생 점수를 업데이트하고 ( 최대 10만회 호출) - 특정팀의 1등 점수 ( 동일점수라면 id 값으로 비교)를 구하는 api 가 있다. ( 해당 API 는 최대 100회 호출) 학생을 넣거나 빼거나 특정학생의 점수를 업데이트하는것은 쉬우므로 나중에 생각하자. 특정팀의 1등 점수구하는것은 100회 호출이므로 그냥 전수조사 해도 된다. 특정 팀의 모든 학생 점수를 업데이트 하는것을 생각해야한다. 이때 우리가 사용하지 ..
삼성전자 certi B형(PRO) 팁 Struct 배열 배열 내부의 struct 를 변경하고 싶으면 포인터로 접근해야한다. 문자열 \n 을 기준으로 나누고, 매번 접근하기 어려우니 Edit 에서 만 접근해놓는다. 문자열은 실제로 중요한가? 아니다. 변경되었는지만 중요하다. for(auto it = arr.begin(); it!=arr.end(); it++); [메모리풀] 메모리를 malloc 하지말고 풀을이용해라. 훨씬 편하다. 전역변수로 몇십만개 만들어두고, poolcnt =0 를 사용해라. 사용한 후에 재초기화도 필요없다. 단지 poolcnt =0 으로 두면 된다. 우리는 어차피 poolcnt++하기전에 해당 주소의 값을 변환하고 사용할 것이기 떄문이다. - 만 사용가능 https://www.acmicpc.net/problem/2606 ..
비트연산 / 비트마스킹 1. 비트연산 1.1 비트 ( bit ) 비트란 컴퓨터에서 자료를 표현하기 위해서 비트를 사용합니다. 1 bit = 0 또는 1 8 bit = 1byte 1.2 비트 연산자 & , | , ^ , ~ , >> , > 는 2의 n 승을 곱하고 나눈것과 같다 1.3 연산자의 우선순위 사칙연산 > 비교연산자 = 논리연산자. 비교연산자 > "비트연산자" > 논리연산자 1.3 비트연산 응용 ex ) 대문자의 아스키 코드는 모두 여섯번째 비트가 0이고 소문자의 경우에는 여섯 번째 비트가 모두 1이다. 따라서 XOR 연산을 이용하여 문자의 여섯 번째 비트를 바꿔주면 대소문자가 바뀌게 된다. char case_convert(char alphabet) { return alphabet ^ 32; // 32 는 이진수로 10..