알고리즘 정리 0x02 기초 코드 작성 요령

Taegang Yun·2024년 4월 16일
1

알고리즘 정리

목록 보기
1/7

참고

STL과 함수 인자

void func(int a){
	a = 5;
}

int main(void){
	int t = 0;
    func(t);
    cout << t;
}
void func(int arr[]){
	arr[0] = 10;
}
int main(void){
	int arr[3] = {1, 2, 3};
    func(arr);
    cout << arr[0];
}

위 두 개의 코드의 실행결과는 어떨까?
각각 0, 10이다.

첫 번째는 int를 함수 인자로 보내면 값이 복사되어 넘어간다. 그러니 함수에서 값을 바꾼다고 main의 변수 t에는 영향을 줄 수 없다.

두 번째는 func에 int 배열 arr를 인자로 주는게 arr의 주소를 넘겨주니 arr[0]을 func 함수에서 바꾸면 원본의 값도 자연스럽게 바뀐다.

참조자(Reference)

STL

STL 은 C++에서 제공되는 라이브러리다.
그중 vector는 일종의 가변배열이다.

void func(vector<int> v){
	v[10] = 7;
}
int main(void){
	vector<int> v(100);
    func1(v);
    cout << v[10];
}

위 코드의 결과는? 0이다.
STL도 비슷하게 함수 인자로 실어 보내면 복사본을 만들어서 보내기 때문에 func1 함수에서 바꾼 것은 원본에 영향을 주지 않는다.

bool cmp1(vector<int> v1, vector<int> v2, int idx){
	return v1[idx] > v2[idx];
}

이 코드의 시간복잡도는? O(N)이다.
왜냐하면, 아까도 말했듯이 인자로 실어보낼 때 복사본을 만들기 때문이다.

bool cmp2(vecto<int> &v1, vector<int>&v2, int idx){
	return v1[idx] > v2[idx];
}	

v1, v2의 type을 vector의 reference로 만들게 되면 cmp2가 호출될 때 복사본을 따로 만들지 않고 참조 대상의 주소 정보만 넘어가 시간복잡도는 의도한대로 O(1)이 된다.

표준 입출력

str.c_str(), getline(cin, str)

scanf/printf의 아쉬운 점은 C++ string을 처리할 수가 없다.
scanf/printf를 쓰면서도 C++ string을 활용하고 싶으면 일단 char* 로 입력을 받고 string으로 형 변환을 해서 원하는 작업을 끝낸 후 c_str() 을 이용해 출력한다.

int main(void){
	char a[10];
    printf("input : ");
    scanf("%s", a);
    string s = a;
    printf("a is %s\n", a);
    printf("s is %s\n", s.c_str());
}

공백이 있는 문자열의 경우
string s;
getline(cin, s);

getline으로 받는 것이 가장 편하다.

ios::sync_with_stdio(0), cin.tie(0)

cin/cout을 사용한다면 위의 두 명령을 실행시켜야 한다.
그래야 입/출력의 양이 많을 때 시간초과를 막을 수 있다.

endl 은 절대 쓰지 마라

profile
언젠간 전문가가 되겠지

0개의 댓글