안녕하세요 프로그래밍 공부를 하고 있는 대학생입니다.
알고리즘 문제를 C++로 구현 한 뒤 호기심이 생겨서 C로 코딩을 해봤습니다.
C로 구현한 쪽이 스스로 느끼기에 코드도 더 길고 난잡하고 불필요한 부분이 많이 있다고 생각했는데
C++로 구현한 쪽이 속도가 8ms가 나왔고 C는 0ms가 나왔습니다.
그리고 C로 구현한 쪽이 코드 길이가 더 길지만 크기는 C++파일의 크기의 절반이였습니다.
어떤 부분에서 그런 차이점이 발생했는지 너무 궁금합니다. 고수님들 알려주세요 ㅠ
<C로 구현>
#include <stddef.h>
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <stdlib.h>
#define MAX_LENGTH 1000
char *iterator;
bool assertNotNull(char* input) {
bool ret = true;
if (input == NULL)
ret = false;
return ret;
}
char *reverse(char *input) {
char head = *(input);
char *ret = (char*)malloc(sizeof(char)*MAX_LENGTH);
memset(ret, '\0', 1);
if (head == 'w' || head == 'b') {
char str[2] = { head , '\0' };
memcpy(ret, str, 2);
}
else {
char *leftTop = reverse(++iterator);
char *rightTop = reverse(++iterator);
char *leftBot = reverse(++iterator);
char *rightBot = reverse(++iterator);
char str[2] = { 'x','\0' };
memcpy(ret + strlen(ret), str, 2);
memcpy(ret + strlen(ret), leftBot, strlen(leftBot)+1);
memcpy(ret + strlen(ret), rightBot, strlen(rightBot)+1);
memcpy(ret + strlen(ret), leftTop, strlen(leftTop)+1);
memcpy(ret + strlen(ret), rightTop, strlen(rightTop)+1);
free(leftTop);
free(leftBot);
free(rightTop);
free(rightBot);
}
return ret;
}
int main() {
int caseNum;
char *input = (char*)malloc(sizeof(char)*(MAX_LENGTH));
char **ret = (char**)malloc(sizeof(char*)*MAX_LENGTH);
scanf("%d", &caseNum);
for (int i = 0; i < caseNum; i++) {
scanf("%s", input);
iterator = input;
*(ret + i) = (char*)malloc(strlen(input) + 1);
*(ret + i) = reverse(input);
}
for (int i = 0; i < caseNum; i++) {
printf("%s\n", *(ret + i));
}
return 0;
}
<C++로 구현>
#include <string>
#include <iostream>
#include <vector>
using namespace std;
string reverse(string::iterator &it) {
char head = *(it);
string ret = "";
if (head == 'w' || head == 'b') {
ret += head;
}
else {
string leftTop = reverse(++it);
string rightTop = reverse(++it);
string leftBot = reverse(++it);
string rightBot = reverse(++it);
ret += 'x' + leftBot + rightBot + leftTop + rightTop;
}
return ret;
}
int main() {
int caseNum;
string input;
vector<string> ret;
cin >> caseNum;
for (int i = 0; i < caseNum; i++) {
cin >> input;
string::iterator it = input.begin();
ret.push_back(reverse(it));
}
for (int i = 0; i < caseNum; i++) {
cout << ret[i] << endl;
}
return 0;
}