소개
시판되는 c++를 다루고 있는 책들은 c++의 객체지향적인 부분에 좀 더 중점을 두고 있는데, 알고리즘 문제해결에서 객체지향 패러다임을 사용하는 경우는 별로 없습니다.
따라서 c++로 알고리즘 문제를 해결하는데에 불필요한 부분을 최대한 잘라내는것을 목표로, 코딩테스트 및 경시대회, 알고리즘 문제해결에 필요한 최소한의 부분만을 확실하게 이해시키는것을 목표로 합니다.
이 글을 읽기에 적합한 독자층은
- 컴퓨터공학과 신입생 (kpsc 동아리 신입생 포함)
- 코딩테스트를 준비하는 사람들
- 과외/스터디 등등
입니다.
습관상 서술하게 되는 단어들을 미리 나열해두겠습니다.
- 백준 = acmicpc.net / solved.ac 두 사이트를 의미합니다.
가장 많은 분들이 알고리즘 문제해결에 사용하는 사이트입니다. - C++ = C언어. C와 C++ 사이의 공통점이 매우 많은 관계로, 서술 시 C언어에 관련한 이야기가 나와도 C++라고 이해해주셔도 무방합니다.
- PS = Problem Solving. 알고리즘 문제풀이의 축약어입니다.
왜 C++인가?
- python/java에 비해 빠르다
- 경시대회를 준비할때도 써먹을 수 있다.
- 이진 비트 등의 사용에 보다 적합하다.
- 대부분의 대회 및 코딩테스트 환경에서 지원한다.
등등의 이유가 있습니다.
가장 큰 이유로는 고난이도 문제로 갈 수록 C언어 특유의 빠른 처리성능을 필요로 하기 때문에, 알고리즘을 깊게 탐구하시는 분들의 대부분은 c++를 사용하시거나, 사용하실 수 있으나 다른 언어를 사용중이라는 점 때문입니다.
프로그래밍의 시작, Hello World
모든 프로그래밍 언어의 시작은 Hello World
를 작성하는 프로그램이라고 할 수 있습니다.
알고리즘적인 측면으로 볼 때, 입력이 없으며 정해진 문장을 출력하는 문제가 가장 단순하다고 할 수 있습니다. 이를 반증하는 것이 백준에서 가장 많이 푼 사람 순으로 정렬한 <문제 순위> 입니다.
백준에서의 3만개가 넘는 문제들 중, 가장 많은 사람들에게 선택받은 데에는 그만한 이유가 있는 법입니다.
#include <iostream>
int main(){
std::cout << "Hello World";
return 0;
}
위의 소스코드가 Hello World를 출력하는 C++ 프로그램입니다.
이 소스코드를 한 문장 한 문장씩 뜯어보도록 하겠습니다.
프로그래밍 대원칙(뇌피셜)
프로그래밍 언어에 대해 처음 배우기 시작하는 분들이 가장 어려워하는 부분이 저 수많은 단어들을 모두 외우는 것입니다.
가장 흔한 접근이 저걸 철자별로 i.. o.. s.. t.. r.. e.. a.. m.. 이러고 있는 행동인데, 이에 대한 해결법을 열심히 고심한 끝에 감히 "대원칙" 이라는 이름을 붙여보려 합니다.
- 모든 명령어는 영어 단어가 모여있는 것입니다.
- 소스코드가 긴것을 선호하지 않기에, 최대한 축약합니다.
- 모든 괄호 (){}[] 는 반드시 짝이 맞아야 합니다.
- 명령어를 정 암기하시겠다면 원형을 암기하십시오.
include
#include <iostream>
보겠습니다
저기서 iostream을 글자단위로 외우지 마시고, 저 구문을 왜 썼는지에 대해 고민해보겠습니다.
include에는 "포함하다" 라는 뜻이 있고,
iostream은 Input Output STREAM의 약자입니다.
여기서 Input과 Output은 입력과 출력이 맞고, STREAM은 흐름입니다.
즉 저 문장은 "입출력의 흐름을 담당하는 것을 포함하겠다" 가 됩니다.
다시 말해서, 저 문장이 존재해야 C++라는 언어가 입력과 출력을 정상적으로 할 수 있습니다.
int main()
int main(){}
보겠습니다.
int는 integer의 축약형으로, 중학수학에서의 "정수"를 의미합니다.
main은 문자 그대로 메인, 핵심을 의미합니다.
C언어에서는 수학에서의 함수 f(x) 를 다음과 같이 표현할 수 있습니다.
int f(int x){}
이 함수와 main이 생겨먹은게 비슷하다는 점을 통해서, main도 함수의 하나구나! 를 생각해볼 수 있습니다.
따라서, 해당 문장은 함수, 여기서는 제일 핵심이 되는 단 하나의 함수인 "프로그램"의 시작을 알리는 문장이 됩니다.
함수 내부에서 수많은 계산이 이루어 질텐데, 앞으로 계산들은 함수의 내부를 뜻하는 {중괄호} 안에서 계산이 이뤄져야 합니다.
std::cout
std::cout은 두 부분으로 분리하셔서 보셔야 합니다.
std란 STanDard 의 약자로, "일반적"이라는 의미를 가지고 이 맥락에서는 cout이 어디에 속하는지를 알려주는 역할을 합니다.
"일반명령어 모음집 속의 cout" 정도의 뜻이 됩니다.
cout은 그럼 어떤 것의 약자일까요?
C + OUT 으로 나눠 보시면 명확해집니다.
글자를 출력하기 위한 함수가 COUT인데,
여기서 "글자" 에 해당하는 부분이 Character의 C이고,
"출력"해야 하기 때문에 OUTput입니다.
출력을 하려면 글자 -> 화면으로 내보내야 하기 때문에,
화살표의 방향이
std::cout << "Hello World";
가 됩니다.
문자열의 끝에 ; 이 붙어있는걸 확인하실수 있는데,
이걸 세미콜론 이라고 부르고 C언어에서 하나의 문장, 명령어가 끝났다는 것을 가리키는 역할을 하게 됩니다.
python은 한 줄에 하나의 문장만을 적을 수 있지만,
C언어는 우리가 온점 . 를 찍어 문장을 구분하듯이 세미콜론으로 문장을 구분하기에
std::cout<<"A"; std::cout<<"B"; std::cout<<"C";
이렇게 한 줄에 여러 구문을 사용할 수도 있습니다.
return 0;
return 0;
에 대해서 보려면, int main(){}
으로 돌아가보아야 합니다.
main이 마치 f(x)와 비슷한 하나의 함수이구나 를 이해하셨다면,
함수에서 가장 중요한 반환값은 누가 담당하고 있는가? 라는 의문이 드실 수 있습니다.
return 0;
이라는 문장이 그 역할을 수행합니다.
return에는 반환하다 라는 뜻이 있습니다.
앞서서 main 앞에 정수를 의미하는 int를 붙였는데,
int가 아니라 만약 텅 비었다는 뜻의 void를 붙일수도 있습니다.
이 경우, return 뒤에 오는 반환값, main이라는 함수가 돌려주어야 할 값도 void가 되기 때문에 return;
으로 작성하실 수 있습니다.
void 형으로 작성한 프로그램은 이런 모습이 됩니다.
#include <iostream>
void main(){
std::cout << "hello world";
return;
}
cout의 축약
여러 cout 문을 써야하는 상황이라고 해보겠습니다.
#include <iostream>
int main(){
std::cout << "Hello World";
std::cout << "Hello World";
std::cout << "Hello World";
std::cout << "Hello World";
std::cout << "Hello World";
return 0;
}
std::cout 이라는 문자가 반복 사용되고 있습니다
앞선 뇌피셜 대원칙에 의하면, 최대한 축약하는 것이 좋은데
더 축약할 수 있을까요?
cout 은 다른 기능들과 구분되는 어떤 "기능" 을 말합니다.
출력이라는 역할을 가지고 있어요.
하지만 std는 STanDard에 속한다 라는 정보만 알려주고 있습니다.
이 std를 떼어내 보겠습니다
#include <iostream>
using namespace std;
int main(){
cout << "Hello World";
cout << "Hello World";
cout << "Hello World";
cout << "Hello World";
cout << "Hello World";
return 0;
}
using namespace std;
라는 구문을 추가했습니다.
STanDard "이름 공간"에 속하는 것들을 사용하겠다고 합니다.
std를 모든 명령어에 붙여라 정도로 이해하시면 깔끔해집니다.
지금은 출력문인 cout만 사용하고 있지만, 앞으로 보다 많은 명령어들을 사용하실때 일일히 std를 붙이시는 것보다는 소스코드가 짧아집니다.
std::cout
에서
:: 는 "안에 있는" 정도의 의미를 지니기 때문에, std가 사라지면서
자연스럽게 :: 도 불필요해집니다.
보다 소스코드를 축약할 수 있게 되었고, 일반적인 Hello World를 출력하는 프로그램을 재작성해보자면 다음과 같습니다.
#include <iostream>
using namespace std;
int main(){
cout << "Hello World";
return 0;
}
결론
모든 C++ 프로그램에 반드시 필요한 부분을 알아보았습니다. 당장 외워서 타이핑하지 못하더라도 괜찮습니다. 앞으로 작성하시게 될 모든 프로그램에서 몇 번이고 작성하기 때문에, 외운다고 의식하시지 않으셔도 자연스럽게 사용하시게 될 것입니다.
오늘 배운 내용만으로 해결할수 있는 문제입니다.
- boj 2557 Hello World - 느낌표를 빼먹지 않으시면 해결하실수 있습니다.
- boj 10699 오늘 날짜 - 문제를 해결하시는 그 날짜를 적어서 출력합니다.