알고리즘을 공부할 때는 무슨 언어로 시작할 지 선택하는 것이 중요한데, 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을 대입해 놓는다.
}