728x90
반응형
728x90
반응형
new와 delete는 C++에서 새롭게 등장하는 키워드다. C언어에서 malloc과 free와 대응되는 키워드다. 아래 코드를 보자.int main(void){ int* ptr = new int; *ptr = 10; std::cout 3번째 줄에서 int형 포인터 변수 ptr에 int형만큼의 메모리를 할당하고 4번째 줄에서 ptr이 가리키는 메모리 영역에 10을 저장한다. 그리고 8번째 줄에서 ptr의 메모리를 해지하는 코드다. 아래 코드는 위 코드의 C언어 버전이다.int main(void){ int* ptr = (int*)malloc(sizeof(int)); *ptr = 10; printf("%d\n", *ptr); free(ptr); return 0;}n..
생성자(Constructor)생성자(constructor)란 객체를 생성하면 자동으로 호출되는 함수를 말한다. 아래 코드를 보자.#include class Date { int y; int m; int d; public : Date(int y_, int m_, int d_) { y = y_; m = m_; d = d_; }; int DateGetYear(void); int DateGetMonth(void); int DateGetDay(void);};int Date::DateGetYear(void){ return Date::y;}int Date::DateGe..
네임스페이스(namespace)는 C++에서 식별자들을 그룹화하고 충돌을 방지하기 위한 방법으로 사용된다. 이게 무슨 말이냐면 예를 들어 A고등학교에 1학년 2반에 김민수라는 학생이 있고, 1학년 5반에 김민수라는 학생이 있어서 총 2명의 김민수가 있다면 김민수라는 학생을 부르기 위해서 이름을 부른다면 2명의 김민수가 모두 대답할 것이다. 1학년 2반의 김민수만을 부르고 싶다면 "1학년 2반 김민수"라고 부르면 1학년 2반의 김민수만 대답을 할 것이다. 이와 같은 개념이 네임스페이스다. 이 내용을 코드로 살펴보면. #include namespace one_two_class_minsoo { void minsoo(void); } namespace one_five_class_minsoo { void minso..
inline 함수inline 함수는 매크로 함수를 대체할 수 있다. #include #define SQUARE(x) ((x)*(x))// inline으로 정의inline int square(int x){ return x*x;}int main(){ // inline 함수를 호출 std::cout3번째 줄에서 정의한 #define SQUARE(x) ((x)*(x)) 매크로 함수와 6~9 번째 줄에 정의한 inline int square(int x)는 동일한 기능을 수행하는 함수다. 매크로 함수를 호출한 경우 전처리 과정을 거치면서 SQUARE(12) 가 ((12)*(12))로 대체된다. 이와 같이 함수의 몸체 부분이 함수 호출 문장을 완전히 대체 했을 때 함수가 인라인화 되었다. 라고 표..
C++에는 C 언어의 포인터(Pointer)와 유사한 개념의 참조자(Reference)라는 것이 있다. 참조자를 이야기 하기전에 우선 변수에 대한 개념을 다시 확인해보자. 변수란?할당된 메모리 영역에 붙여진 이름으로 변수를 통해 메모리 영역에 접근이 가능하다. 위 그림으로 예를 들어 설명하면, char형 변수 Value는 1Byte의 메모리 공간이 할당됬고, 할당된 메모리 영역의 주소는 0x1000 번지다. 즉 Value를 통해 0x1000 번지에 저장된 1byte의 데이터에 접근할 수 있다는 뜻이다. 참조자는 "변수의 별명" 이라고 할 수 있다. 코드를 통해 알아보자. #include using namespace std;int main(void){ int value = 10; int &value_..
memset은 변수를 초기화시킬 때 많이 사용하는 C 표준 함수다. 우리가 흔히 알고 있기로는 변수를 어떤 값으로 초기화시킬 때 사용한다고 알고 있다. 함수 원형을 살펴보면, void *memset(void *dest, int c, size_t count); 위와 같다. 반환하는 값은 전달인자 c로 변경된 *dest 다. 아래 코드를 살펴보자. #include int main(void) { char array[10] = {1,2,3,4,5,6,7,8,9,0}; for(int i = 0; i < 10; i++){ printf("%d ", array[i]); } memset(array, 0, 10); for(int i = 0; i < 10; i++){ printf("%d ", array[i]); } } 첫번..
3진법, 당황했다. 우선 내가 짠 코드 #include #include #include int solution(int n) { int answer = 0; int square = 0; int buff[5000] = {0, }; while(n > 0) { buff[square++] = n%3; n/=3; } for(int i = 0; i < square; i++) { answer = answer + (buff[i] * (pow(3, (square-i-1)))); } return answer; } 정답은 통과했지만, 맘에들지 않는다. 아래는, 감탄사가 나오는 코드 역시 세상에 천재는 많다. 굿굿 #include #include #include int solution(int n) { int temp = 0; ..
이번 코딩테스트는 피보나치 수 아..근데 문제가 좀 이상하다 . 2이상의 n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하라고 해서 아래와같이 작성했더니 테스트 7번부터 실패로 나오기 시작한다. #include #include #include int solution(int n) { int answer = n%1234567; int F1 = 0; int F2 = 1; for(int i = 1; i < n; i++) { answer = F1+F2; F1 = F2; F2 = answer; } return answer % 1234567; } for문으로 피보나치 수를 구한다음 for문을 빠져나오면 answer에 n 번째 피보나치 수가 있기 때문에 1234567로 나눈 나머지 값을 리턴하면 답이 맞다고..
두 정수 a, b 가 주어진다. a부터 b 까지 숫자의 약수를 구한다. 약수의 갯수가 짝수면, 해당 수를 더하고, 홀수면 뺸다. 다양한 코드가 있지만 거의 대부분 나와같이 코드를 작성했고, 어떤 한분이 조금 독특한 방식으로 코드를 작성했는데, 이건 뭐 개인의 취향이지만 난 가독성도 중요하게 생각한다. 짧고 간결한것도 중요하지만, 누구나 다 쉽게 읽고 빠르게 파악할 수 있도록 코드를 짜는것도 중요하다고 생각한다. #include #include #include int solution(int left, int right) { int answer = 0; int count = 1; // 1은 무조건 포함 int len = right - left; // left 부터 right 까지 갯수 for(int i = ..
주어진 문자열을 소문자에서 대문자 순서로 정렬하라. #include #include #include #include // 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요. char* solution(const char* s) { // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요. int len = strlen(s); char temp; char* answer = (char*)malloc((sizeof(char) * len)); strcpy(answer, ""); // answer clear strcpy(answer, s); for (int i = 0; i < len; i++) { // bubble sort ..
없는 숫자 더하기, 0부터 9까지의 숫자 중 일부가 들어있는 정수 배열 numbers가 매개변수로 주어집니다. numbers에서 찾을 수 없는 0부터 9까지의 숫자를 모두 찾아 더한 수를 return 하도록 solution 함수를 완성해주세요. 문제를 해결하는 방법은 2가지다. 1. 0부터 9까지 모두 더하면 45다. 배열 numbers에 있는 모든 숫자를 더한 다음 45에서 빼면 간단하게 해결 2. 배열에서 없는 숫자를 골라낸 다음 더하는 방법 실제로 기업에서 이런 테스트가 나왔을 때 1번과 같이 해결한다? 코딩 테스트는 통과하겠지만 풀이 과정 또한 중요하기 때문에 나 같으면 틀린 것으로 채첨 할 것 같다. 문제에는 분명 "모두 찾아 더한 수"라고 되어 있다. 1번 과같이 해결한 방법은 더한수를 리턴한..
아... 문자열에 취약한 콩이... 임베디드 개발을 하다 보면 문자열을 다룰일이 거의 없다. 아니 정확히 말하면 있는데 보통 하나의 바이트로 처리를 하니까 특별히 신경 쓸 일이 없다. 그리고, 한글? 다룰일이 없다. 이번 기회에 공부했다. 1. 길이가 n인 "수박수박수박수박수박..."과 같은 패턴을 유지하는 문자열을 리턴 2. 홀수면 "수", 짝수면 "박"으로 끝남. #include #include #include #include char* solution(int n) { // 리턴할 값은 메모리를 동적 할당해주세요. char* answer = (char*)malloc(((sizeof(char)*3)*n)); strcpy(answer, ""); // 쓰레기값 제거 for(int i = 0; i < n; ..
숫자가 담긴 배열 absolutes 숫자의 개수(길이)가 담긴 배열 abolutes_len 숫자의 부호가 담긴 배열 signs 숫자의 부호 개수(길이)가 담긴 배열 signs_len 1. absoultes에 담긴 모든 숫자를 더함. 2. 부호를 판별해 fasle면 숫자를 음수로 변경하고 더함. #include #include #include // absolutes_len은 배열 absolutes의 길이입니다. // signs_len은 배열 signs의 길이입니다. int solution(int absolutes[], size_t absolutes_len, bool signs[], size_t signs_len) { int answer = 0; for(int i = 0; i < absolutes_len; ..
주어진 번호의 뒷자리 4개를 제외하고 모두 '*'로 가리기 #include #include #include #include // 파라미터로 주어지는 문자열은 const로 주어집니다. 변경하려면 문자열을 복사해서 사용하세요. char* solution(const char* phone_number) { // return 값은 malloc 등 동적 할당을 사용해주세요. 할당 길이는 상황에 맞게 변경해주세요. char* answer = (char*)malloc(sizeof(char) * 20); int len = strlen(phone_number); int i = 0; while((len-i) > 4) { answer[i] = '*'; i++; } strcpy(&answer[i], &phone_number[i..
두 정수가 주어졌을 때 두 정수 사이의 합을 구해서 리턴, ex) 3, 5가 주어지면 3+4+5 = 12, 12를 리턴 ex) 5, 3으로 주어져도 위와 같이 12를 리턴해야 함. 내가 작성한 코드, 대부분 이런 방식으로 해결했다. #include #include #include long long solution(int a, int b) { long long answer = 0; int s, e; s = (a > b) ? b : a; e = (a > b) ? a : b; printf("%d, %d", s, e); for ( int i=s; ib) //if a is greater, replace num. num = a-b+1; return (long long) sum*num/2; //cast the num..
https://namu.wiki/w/%EC%BD%9C%EB%9D%BC%EC%B8%A0%20%EC%B6%94%EC%B8%A1 콜라츠 추측 - 나무위키 만약 이 추측이 거짓이라면, 1로 가지 않는 반례가 존재한다는 것을 의미한다. 수학자들은 이런 대표적인 반례에 대해서 자기 자신으로 순환하는 루프가 존재할 것으로 예상한다[10]. 예를들어 namu.wiki 주어진 수가 1이 될때까지 반복해서 작업을 한다. 1. 주어진수가 짝수면 2로 나눈다. 2. 주어진수가 홀수면 3을 곱하고 1을 더한다. 3. 결과로 나온수에 같은 작업(1번 or 2번)을 1이 될때까지 반복한다. #include #include #include int solution(long num) { if(num == 1) { return 0; } ..
하샤드 수 구하기, https://ko.wikipedia.org/wiki/%ED%95%98%EC%83%A4%EB%93%9C_%EC%88%98 하샤드 수 - 위키백과, 우리 모두의 백과사전 위키백과, 우리 모두의 백과사전. 하샤드 수 또는 니번 수는 주어진 진법에서 그 수의 각 자릿수 숫자의 합으로 그 수가 나누어지는 양의 정수를 말한다. 즉 이말은 하샤드 수의 정의가 자기자신 ko.wikipedia.org #include #include #include bool solution(int x) { bool answer = false; int harshad=0; int xbuf=x; while(xbuf > 0) { harshad += xbuf % 10; xbuf /= 10; } if(x % harshad ==..
입력된 정수 n이 어떤 양의 정수 x의 제곱인지 아닌지 판별하는 문제, 문제풀이 중 알아낸것 1. n에 0.5를 제곱하면 x가 나온다. 2. 소수점의 판별은 소수점 n에서 강제 형변환한 값을 빼서 나머지가 0이 아니면 소수다. 3. sqrt 함수 내가 작성한 코드 #include #include #include #include long long solution(long long n) { long long answer = 0; double exponentiation; exponentiation = pow(n, 0.5); // sqrt(n); 대체 가능 exponentiation = pow((exponentiation+1), 2); if((exponentiation - (long long)exponentia..
"__attribute__" 키워드는 GCC 컴파일러가 제공하는 확장 기능으로 C 표준은 아니며 윈도우의 #pragma와 비슷한 역할을 한다. Linux나 MCU 소스코드를 분석하다보면 자주 볼 수 있을 것이다. attribute라는 단어 그대로 "속성"을 지정하는 키워드다. __attribute__((__used__)) 컴파일러가 컴파일 과정에서 코드를 최적화 할 때 선언되어 있고 사용되지 않는 변수를 제거하지 않도록 하는 기능 변수를 선언해놓고 사용하지 않을 때 발생하는 관련 warning를 발생시키지 않음 __attribute__((__aligned__(x))) 선언한 변수의 메모리주소를 x의 배수로 정렬 example : __attribute__((__aligned__(sizeof(long))))..