Posts 알고리즘 - C++ 기초 / 자주 쓰이는 문법들
Post
Cancel

알고리즘 - C++ 기초 / 자주 쓰이는 문법들

알고리즘을 공부할 때는 무슨 언어로 시작할 지 선택하는 것이 중요한데, C++을 활용하기로 하였습니다.

C언어를 알고 있는 상태라면 상대적으로 C++을 다루는 데 불편함이 없을 것입니다.

  • C++로 알고리즘을 공부해 놓으면 다양한 라이브러리(예: STL) 들을 활용하는 데 이점을 가질 수 있다.
  • 그리고 문법이 C보다 비교적 간결하고, 실행 속도도 Java에 비해 빠르다. (그래서 보통 코딩테스트에서는 언어마다 실행 시간 제한을 다르게 적용합니다.)
  • C++는 널리 사용되는 언어 중 하나이기 때문에 인터넷 상의 레퍼런스나 참조할 자료들도 풍부하므로 공부하는 입장에서도 좋다.

1. C++ 코딩 기본 - 표준 네임스페이스 및 입, 출력

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream> // C언어의 <stdio.h>격

using namespace std; // 표준 네임스페이스를 사용하겠다는 의미

int main(void){

    int num;
    cout << "숫자 입력 :"; // cout는 C의 printf와 동일하다.
    cin >> num; // cin은 C의 scanf와 동일하다.
    cout << num << endl; // endl은 C의 개행문자 출력과 동일하다.

    return 0;
}

C에서 가장 처음 배우는 것이 자료형 선언과 printf, scanf 였습니다. C++은 그 방식이 더 쉽다고 생각합니다.

먼저 첫줄에 using namespace std; 라고 작성했는데 이것은 표준 네임스페이스를 사용하겠다는 의미입니다. C는 이러한 변수나 함수의 소속(클래스)을 생각하는 개념이 없었습니다. 하지만 C++에서는 ‘네임스페이스’ 개념을 제공합니다.

그래서 기본적으로 standard 네임스페이스는 std 이며, 맨 첫줄에 global하게 이를 선언하게 되면, “앞으로 여기에서 사용되는 변수나 함수들은 std 네임스페이스 소속이다” 라고 알리는 것입니다. 더 구체적으로는, “namespace에 있는 std 클래스에 정의된 함수들을 사용하겠다”는 의미가 됩니다.

위에서 볼 수 있듯이 cout, cin, endl 등이 모두 std에 들어있는 함수들입니다.

만약 using namespace std; 를 선언하지 않았다면,

1
2
3
4
5
6
7
8
9
10
11
#include <iostream>

int main(void){

    int num;
    std::cout << "숫자 입력 :"; // cout는 C의 printf와 동일하다.
    std::cin >> num; // cin은 C의 scanf와 동일하다.
    std::cout << num << std::endl; // endl은 C의 개행문자 출력과 동일하다.

    return 0;
}

이렇게 작성해야 합니다. :: 는 범위지정 연산자로 함수나 변수명 등을 namespace에 따라 구분해야 할 때 사용합니다.

처음과 같이 global하게 네임스페이스를 선언하는 것은 위험한 방법입니다. (나중에 여러 네임스페이스들을 사용할 경우 충돌 관련한 문제가 발생할 수 있음) 그러나 여러 네임스페이스를 사용하지 않고 간단한 알고리즘 등을 공부할 때에는 편의상 이처럼 global한 네임스페이스 std를 선언해 보겠습니다.

2. 배열 입력받기(배열, 문자열)

알고리즘을 공부할 때 자주 하는 것 중 하나가 ‘문자열 입력받기’ 입니다. 이 부분에서도 C보다 C++가 훨씬 간결하고 생각하기도 편합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;

int main(void){

    char arr[10];
    cout << "문자 입력";
    cin >> arr;
    cout << "내용 : " << arr;

    cout << strlen(arr) << endl;
    cout << arr[0] << endl;

    return 0;
}

C에서처럼 서식문자 (%s, %c 등)를 자료형에 따라 고려하지 않고, cout, cin 함수로 동일하게 활용할 수 있어 직관적입니다.

만약 공백 포함해서 한 줄 전체를 입력받고 싶을 때는 getline 함수를 사용합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
using namespace std;

int main(void){

    char arr[10];
    cout << "문자 입력";
    cin.getline(arr,10); // 10은 최대 입력 가능 문자수, default 종결 문자는 \n (개행문자)
    // cin.getline(arr,10,' '); // [예] 세 번째 인자는 종결 문자 설정 -> 공백(' ')
    cout << arr;

    return 0;
}

3. 동적할당

알고리즘 문제에서는 input으로 배열 크기를 입력받는 것이 매우 빈번합니다. C에서는 malloc을 이용했는데, C++에서는 다음과 같이 동적할당을 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;

int main() {

	int* p = new int(0); // 동적 메모리 할당, 초기값은 0으로 줌
    // int * p = new int; -> 동적 메모리 할당, 초기값은 주지 않음

	if (p == NULL) {
		cout << "failed" << endl;
		exit(1);
	}
	*p = 100;
	cout << *p;

	delete p; // C에서의 free와 동일
	p = NULL; // 메모리 해제 후 NULL을 대입해 놓는다.

}

배열 동적할당은 다음과 같이 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using namespace std;

int main() {

	int* arr = new int[10]; // 동적 메모리 할당

	if (arr == NULL) {
		cout << "failed" << endl;
		exit(1);
	}

    arr[0] = 10;
    ...

	delete[] arr; // C에서의 free와 동일
	arr = NULL; // 메모리 해제 후 NULL을 대입해 놓는다.

}

알고리즘 - SW Expert Academy 소개

제목 1(리뷰)