SlideShare una empresa de Scribd logo
1 de 48
Descargar para leer sin conexión
HI-ARC 정기모임 #1
(Problem Solving 101)
이재열(@kodingwarrior), 김민균(@brandon)
본 강의는 Problem Solving 중심입니다.
필요한 만큼만 C++ 를 다루므로
유의바랍니다.
Table Of Contents
● PS 101
● Basic input, output
● Variable, Type
PS - Problem Solving
Alias for Competitive Programming
- 직역하면 경쟁적인 프로그래밍
- 프로그래밍 대회를 위한 프로그래밍
- C++, Java
- Time Limit (1s, 2s, ..)
- Space Limit (256MB, 512MB, … )
프로그래밍 대회
시간 안에 (3시간~5시간)
빠르게
많이 풀어야 한다.
프로그래밍 대회 문제 예시
https://algospot.com/judge/problem/read/QUADTREE
문제를 푸는 사람에게
어떻게 풀이를 해야할 지
단서를 주는 문제에 대한 설명
(description)
Description
프로그래밍 대회 문제 예시
https://algospot.com/judge/problem/read/QUADTREE
각각의 독립적인 Test Case
(하나일 수도 있음),
입력에 대한 전제조건,
문제를 해결하는데 필요한 입력
(조건),
문제를 적절한 방법으로 해결했을때
나타날 수 있는 출력(결과)
Input &
Output
프로그래밍 대회 문제 예시
https://algospot.com/judge/problem/read/QUADTREE
어떻게 문제를 풀 든 정답은 없지만,
시간 제한과 메모리 제한을 맞춰야
한다.
알고리즘을 어떻게 효율적으로
짜느냐가 관건
Feynman의 문제 해결법
1. 칠판에 문제를 적는다.
2. 골똘히 생각한다.
3. 칠판에 답을 적는다.
프로그래밍 대회 문제를 풀 때 접근 방식
1. 문제의 Description 을 이해한다.
2. 문제를 어떻게 해결할지 고민해본다.
a. 코드를 막 짜거나, 문제를 쪼개서 생각해보거나, 시스템 자원을 최대한 쥐어짜거나,
...
3. 프로그램으로 구현해본다.
4. 더 나은 해답은 없는지 고민한다.
Non-Feynman Solution
우리는 리처드 파인만처럼 똑똑하지 않기 때문에 이 방법을 써야할 수도 있습니다
1. 문제를 일단 읽어본다.
2. 어떻게 해결해야할 지 모르겠다면 주변 사람들한테 물어본다.
a. HI-ARC 슬랙 #qna-ps 채널에 물어본다. (가장 빠름)
b. BOJ 슬랙 #qna 채널 혹은 BOJ 게시판에 물어본다. (좀 느릴 수도 있음)
c. 문제와 관련된 이슈를 다루는 블로그 포스트를 본다. (빠를 수도 있고, 느릴 수도 있음)
3. 답을 받아서 적는다.
4. 다음에 문제를 해결할 때는 답을 보지 않아도 해결할 수 있도록 노력한다.
이제 본격적으로 프로그래밍을 해봅시다.
시작하기에 앞서..
Q. C++ 하려면 C 에 대한 기초지식이 있어야 한다는데 사실인가요?
A. C 에 대한 배경지식을 깔고 가야한다고 주장하는 C++ 책은 낡은 도서라 생각하면
됩니다.
(높은 확률로 C++98 버전 기준으로 쓰인 낡은 책일 듯)
우리는 Modern C++(C++11 이상) 로 시작할 겁니다.
교과과정에서 C 를 배운다면 역사책 탐험하는 느낌으로 보는게 좋을 듯
관련 글 : http://minjang.github.io/2016/03/21/talk-with-stroustrup/
(C++ 창시자 비야네 스트로스트룹 이
"C++ 배우는데 C를 먼저 배울 필요 없어요" 라고 직접 말함)
Basic Input/Output
PS 의 기본은 화면에 결과물을 찍어내는 것에서부터 시작한다.
#include <iostream>
using namespace std;
int main() {
cout << “hello world!” << endl;
return 0;
} Output:
hello world!
#include <cstdio>
int main() {
printf(“hello world!”);
return 0;
}
C++ Style
C99 Style
연습문제
● https://www.acmicpc.net/problem/2557
● https://www.acmicpc.net/problem/10718
(별첨) #include <iostream> 이 낯설어요!
입출력을 위해 사용하는 여러가지 함수, 클래스 들을 가져오기 위해 사용합니다.
출력을 위해 사용되는 입출력 클래스의 인스턴스인 cin, cout 을 이용하려면 cin, cout
이 먼저 선언되어 있어야 합니다.
iostream 헤더파일은 입출력에 필요한 여러 클래스들이 선언되어 있으며, #include 를
통해 iostream 헤더파일을 소스코드에 포함하게 되면, cin, cout 을 불러올 수 있게
됩니다.
(별첨) #include 명령을 실행했을 때 생기는 일
출처 : https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00911_source.html
#include <iostream>
using namespace std;
int main() {
cout << “hello world!” << endl;
return 0;
}
(별첨) using namespace std 가 뭘 의미하나요?
#include <iostream> 으로 불러오는
cin, cout, endl 의 풀 네임은 std::cin, std::cout, std::endl 인데,
std 라는 namespace 를 디폴트로 사용하기 위해 using namespace std 명령을
이용합니다.
● namespace 는 왜 이용하나요?
프로그램이 복잡해지다보면 변수나 함수를 용도별로 묶고 싶을 때도 있고,
어떤 프로젝트에서 사용하는 변수나 함수인지 구분하고 싶을 경우도 있습니다.
편의상으로 변수 이름을 막 짓다보면 name conflict 가 발생할 수도 있지만,
namespace 를 이용하면 그나마 name conflict 의 위험을 최소화 할 수 있습니다.
std 라는 namespace 로 구분된 변수, 함수, 클래스는 C++ Standard 에서 지원합니다.
(별첨) int main(...) {...} 이 낯설어요!
● main 함수는 C 프로그램이 실행될 때 가장 먼저 호출되는 함수입니다.
● main 함수는 int 라는 타입을 가지며,
소괄호( ‘()’ ) 안에 값(매개변수) 이 들어가기도 하지만 PS 에서는 신경쓰지
않아도 됩니다.
● 중괄호 안에는 함수를 호출하고 나서
순서대로 실행할 여러가지 명령을 나열해야 합니다.
● main 함수를 빠져나올 때, 즉, 프로그램을 종료할 때는 return 명령을 적습니다.
● 함수에 대해서 나중에 다시 다룰 예정
(별첨) 나중에 이해해도 괜찮습니다.
1. 프로그램 실행
2. C 의 스타트업
루틴에서 main
함수 호출
3. main 함수에서
적당히
여러가지
명령을 실행
(사용자
정의함수를
호출할 수도
있음)
4. main 함수에서
return 을 통해
빠져나오게
되면 프로그램
종료
Basic I/O
문자열(String) 뿐만이 아니라, 정수형 자료, 실수형 자료, 이외 다른
자료형까지 출력할 수 있다!
#include <iostream>
using namespace std;
int main() {
cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 <<
endl;
// “단체명 : HI-ARC / 창설연도 : 2017 / 평균연령 : 22.7”
return 0;
}
(별첨) cout 의 동작원리가 궁금해요!
cout 으로 출력을 수행하고나서, 다시 연쇄적으로 출력 연산이 이루어
집니다.
cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl;
// 출력결과 : “”
cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl;
// 출력결과 : “단체명 : HI-ARC / 창설연도 : ”
출력 준비 중
cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl;
// 출력결과 : “단체명 : HI-ARC / 창설연도 : 2017”
출력 준비 중
cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl;
// 출력결과 : “단체명 : HI-ARC / 창설연도 : 2017 / 평균연령 : ”
출력 준비 중
(별첨) endl 는 무엇을 의미하나요?
std::endl 는 cout 으로 출력을 할 때 개행(줄바뀜) 문자 역할을 합니다.
(end line 으로 기억하면 편함)
#include <iostream>
using namespace std;
int main() {
cout << “강한친구 대한육군”;
cout << “강한친구 대한육군”;
return 0;
}
#include <iostream>
using namespace std;
int main() {
cout << “강한친구 대한육군” << endl;
cout << “강한친구 대한육군”;
return 0;
}
Output:
강한친구 대한육군강한친구 대한육군
Output:
강한친구 대한육군
강한친구 대한육군
C++ 프로그래밍을 처음 배울때는
계산기를 만든다는 느낌으로 접근하자
● + : 두 수를 덧셈한 결과
○ 2 + 3 == 5
● - : 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 결과
○ 6 - 3 == 3
● * : 두 수를 곱셈한 결과
○ 2 * 3 == 6
● / : 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 결과
○ 10 / 3 == 3
● % : 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 나머지 (정수형만)
○ 7 % 2 == 1
Problem
나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다.
Scenario
1 을 입력한다. (1이라는 결과가 저장)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
…
5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.)
Problem
나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다.
Scenario
1 을 입력한다. (1이라는 결과가 저장)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
…
5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.)
printf(“%d”, 1+2+3+4+5); <- 이건 전혀 바람직하지 않음
Problem
나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다.
Scenario
1 을 입력한다. (1이라는 결과가 저장)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
…
5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.)
printf(“%d”, 1+2+3+4+5); <- 이건 전혀 바람직하지 않음
중간 결과를 저장할
어떤 메모리 장소가 필요함.
Variable/Type
메모리에 어떤 데이터를 담을까?
1. 정수형 자료?
2. 문자열 자료?
3. 문자 하나로만 이루어진 자료?
4. 실수형 자료?
5. 여러가지 데이터가 섞여있는 자료? (구조체, 클래스, …)
Memory Issue
컴퓨터의 메모리는 한계가 있고 (4GB, 8GB, 16GB, … , 1TB, … )
메모리 공간을 모자라지도 않고 너무 남아돌지도 않게
효율적으로 잘 쥐어짜낼 수 있어야 한다.
e.g. 1byte, 2byte, 4byte, 8byte, 2N
* M byte
Variable
메모리 공간을 적당히 확보해놓고,
확보해놓은 메모리 공간에 구분을 목적으로 이름을 부여한 것.
int age; // 나이를 의미하는 정수형 변수
float average_score; // 평균 성적을 의미하는 실수형 변수
string name; // 이름을 의미하는 문자열 변수
Document resume; // 이력서를 의미하는 사용자 정의 변수
Variable Example
정수형으로 사용하고 싶은 데이터가 있다.
4byte 만큼 메모리 공간을 확보했고,
그 메모리 공간에 44 라는 값을 넣을 것인가?
int num = 44; // 대입 연산자(=) 를 이용하여 할당
44
암튼 메모리 어딘가에
있음
(정수 리터럴이라고도 함)
Memory
44 라는 값을
num 으로 copy
num
Variable Example(2)
문자열로 사용하고 싶은 데이터가 있다.
얼마나 쓸 지 모르겠지만 메모리 공간을 확보했고,
그 메모리 공간에 “Hello world” 라는 값을 넣을 것인가?
string text = “Hello world”;
복잡한 연산을 수행하고 싶다면 소괄호를
이용하도록!EX) 근의 공식
#include <iostream>
#include <cmath>
int main() {
float a = 3;
float b = 4;
float c = 5; // 3x2
+ 4x + 5
cout << ((-b) + sqrt(4*a*c)) / (2*a) << endl;
return 0;
}
명령의 실행을 구분할 때는
; (세미콜론) 으로 구분해야
합니다.
QUIZ. 어느 쪽이 정상적으로 돌아갈까요? (다중
선택)
#include <iostream>
using namespace std;
int main() {
int num1 = 4;
int num2 = 5;
cout << num1 + num2;
return 0;
}
#include <iostream>
using namespace std;
int main() {
cout << num1 + num2;
return 0;
}
#include <iostream>
using namespace std;
int main() {
int num1, num2;
cout << num1 + num2;
return 0;
}
ANSWER.
변수를 이용하기 전에 선언은 무조건 해놓자.
#include <iostream>
using namespace std;
int main() {
int num1 = 4;
int num2 = 5;
cout << num1 + num2;
return 0;
}
#include <iostream>
using namespace std;
int main() {
cout << num1 + num2;
return 0;
}
#include <iostream>
using namespace std;
int main() {
int num1, num2;
cout << num1 + num2;
return 0;
}
선언 조차 안 되어있어
어떤 값을 더하고자 하는지 알 수
없음
선언은 했지만,
어떤 값이 들어있는지 알 수 없음
(쓰레기값이 들어감)
?
결과가 9 라는 것을 알 수 있음
Type
컴퓨터에서는 데이터를 이진수로 나타내게 됨.
할당해놓은 메모리 공간 내에서 가질 수 있는 값의 범위.
ex) 101 을 이진수로 나타내기 (int)
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1
231
230
229
228
227
226
225
224
223
222
221
220
219
218
217
216
215
214
213
212
211
210
29
28
27
26
25
24
23
22
21
20
101 = 26
(64) + 25
(32) + 22
(4) + 20
(1)
자료형 정리
bool : true / false 둘 중 하나만 가질 수 있는 값
char : 1byte(8bit). -128 ~ 127 까지의 값을 가질 수 있음
short : 2byte(16bit). -215
~ 215
-1 까지의 값을 가질 수 있음
int : 4byte(32bit). -231
~ 231
-1 까지의 값을 가질 수 있음
long long : 8byte(64bit). -263
~263
-1 까지의 값을 가질 수 있음
float : 4byte(32bit). Sign bit(1) + exponential(8) + mentissa(23)
double : 8byte(64bit).
Sign bit(1) + exponential(11) + mentissa(52)
실수형에 대한 정보는 Wikipedia 혹은 IEEE 754 를 참고
다시 Basic I/O(cin/cout)
정수형으로 사용하고 싶은 데이터가 있다.
4byte 만큼 메모리 공간을 확보했고,
사용자의 입력을 받아서 그 메모리 공간에 어떻게 값을 넣을 것인가?
#include <iostream>
using namespace std;
int main() {
int num;
cin >> num;
cout << num;
return 0;
}
Input:
3
Output:
3
다시 Basic I/O(cin/cout)
문자열로 사용하고 싶은 데이터가 있다.
얼마나 사용할지 알 수 없지만 어쨌든 메모리 공간을 확보했고,
사용자의 입력을 받아서 그 메모리 공간에 어떻게 값을 넣을 것인가?
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
cout << s;
return 0;
}
Input:
HI-ARC
Output:
HI-ARC
연습문제
● A + B : https://www.acmicpc.net/problem/1000
● A - B : https://www.acmicpc.net/problem/1001
● A * B : https://www.acmicpc.net/problem/10998
좀 난이도 있게 가보고 싶다면 이런 것도 해보세요.
● 폰노이만과 파리 : https://www.acmicpc.net/problem/14924
Back to the problem
나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다.
Scenario
1 을 입력한다. (1이라는 결과가 저장)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨)
+ 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정)
…
5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.)
Solution
#include <iostream>
using namespace std;
int main() {
int A, B, C, D, E
cin >> A >> B >> C >> D >> E;
cout << A + B + C + D + E;
return 0;
}
(부록) printf/scanf
주어진 형식에 맞게 입출력을 하는데 쓰이는 함수.
#include <cstdio>
int main() {
int a = 1; float b = 2.33; long long c = 100000000000;
char[] d = “asdsadadadadadadsa”; char e = ‘h’;
printf(“%d %f %lld %s %c”, a, b, c, d, e)
} 각 인자에 대응되는 format placeholder
Format placeholder 의
갯수만큼 추가적으로
인자를 넣을 수 있음
(부록) printf/scanf
주어진 형식에 맞게 입출력을 하는데 쓰이는 함수.
#include <cstdio>
int main() {
int a; float b; long long c;
char d[10]; char e;
scanf(“%d %f %lld %s %c”, &a, &b, &c, &d, &e)
} 각 인자에 대응되는 format placeholder
Format placeholder 의
갯수만큼 추가적으로
인자를 넣을 수 있음
뒤에 따라오는 인자에는
변수가 위치한
메모리상의 주소가
들어가야함
(부록) printf/scanf
Type 에 따른 format placeholder 표기법 정리
%c char 를 입출력
%d int 를 입출력
%ld long 을 입출력
%lld long long 을 입출력
%f float, double 를 입출력
%lf long double 을 입출력
%s C 에서 취급하는 문자열 을 입출력
(null 로 끝나는 문자열)
%x 정수형 변수(unsigned int) 를
헥사표기법(16진법)으로 출력(소문자)
%X 정수형 변수(unsigned int) 를
헥사표기법으로 출력(대문자)
%e 실수형 변수를 유효숫자 표기법으로 출력
%a 실수형 변수(unsigned double) 를
헥사표기법(16진법)으로 출력(소문자)
%A 실수형 변수(unsigned double) 를
헥사표기법(16진법)으로 출력(소문자)
입출력과 관련된 여러가지 예제는 직접 찾아보길
권장EX) 입력을 받지 않을 때까지 계속해서 읽어들이기,
한글자 한글자 읽어들이기, ...
입출력과 관련된 다양한 예제는 (자체검열) 에서 다룰 예정입니다.
HI-ARC 위키에서 “C/C++ 입출력 정리” 문서를 검색하세요
뭔가 많이 배운 것 같죠?
지금 당장 다 흡수하려고 할 필요까지는 없습니다.
코딩하다보면 이런 것들을 상식으로 생각하는 선까지 오게 됩니다.
초조해하지말고 배우는 과정을 즐기시길 바랍니다 :)
다음 주는 if/else 문 사용법을
간단하게 짚고 넘어가겠습니다.

Más contenido relacionado

La actualidad más candente

[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석jaypi Ko
 
6장 표현식 및 문장
6장 표현식 및 문장6장 표현식 및 문장
6장 표현식 및 문장재정 이
 
[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석jaypi Ko
 
확통 회귀분석
확통 회귀분석확통 회귀분석
확통 회귀분석jaypi Ko
 
말의여행
말의여행말의여행
말의여행mil23
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 HwpKimjeongmoo
 
Mathematics
MathematicsMathematics
Mathematicsskku_npc
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexityskku_npc
 
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Seok-joon Yun
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 명신 김
 
[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론jaypi Ko
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdfkd19h
 
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이NAVER D2
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03chl132435
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이NAVER D2
 
Data Structure - 1st Study
Data Structure - 1st StudyData Structure - 1st Study
Data Structure - 1st StudyChris Ohk
 

La actualidad más candente (20)

[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석[신경망기초] 소프트맥스회귀분석
[신경망기초] 소프트맥스회귀분석
 
6장 표현식 및 문장
6장 표현식 및 문장6장 표현식 및 문장
6장 표현식 및 문장
 
[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석[신경망기초] 선형회귀분석
[신경망기초] 선형회귀분석
 
확통 회귀분석
확통 회귀분석확통 회귀분석
확통 회귀분석
 
말의여행
말의여행말의여행
말의여행
 
Project#2말의여행 Hwp
Project#2말의여행 HwpProject#2말의여행 Hwp
Project#2말의여행 Hwp
 
자료구조02
자료구조02자료구조02
자료구조02
 
Mathematics
MathematicsMathematics
Mathematics
 
Computational Complexity
Computational ComplexityComputational Complexity
Computational Complexity
 
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
Effective Modern C++ MVA item 18 Use std::unique_ptr for exclusive-ownership ...
 
불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14 불어오는 변화의 바람, From c++98 to c++11, 14
불어오는 변화의 바람, From c++98 to c++11, 14
 
Ch05
Ch05Ch05
Ch05
 
[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론[신경망기초] 신경망의시작-퍼셉트론
[신경망기초] 신경망의시작-퍼셉트론
 
이산치2번
이산치2번이산치2번
이산치2번
 
2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf2012 Dm A0 02 Pdf
2012 Dm A0 02 Pdf
 
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
[D2 CAMPUS] 2016 한양대학교 프로그래밍 경시대회 문제풀이
 
2012 Dm C3 03
2012 Dm C3 032012 Dm C3 03
2012 Dm C3 03
 
BOJ4743
BOJ4743BOJ4743
BOJ4743
 
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
[D2 CAMPUS] 숭실대 SCCC 프로그래밍 경시대회 문제 풀이
 
Data Structure - 1st Study
Data Structure - 1st StudyData Structure - 1st Study
Data Structure - 1st Study
 

Similar a HI-ARC PS 101

RNC C++ lecture_4 While, For
RNC C++ lecture_4 While, ForRNC C++ lecture_4 While, For
RNC C++ lecture_4 While, Foritlockit
 
RNC C++ lecture_2 operator, if
RNC C++ lecture_2 operator, ifRNC C++ lecture_2 operator, if
RNC C++ lecture_2 operator, ifitlockit
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍준혁 이
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)Sang Don Kim
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기Chris Ohk
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7pkok15
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features SummaryChris Ohk
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2Chris Ohk
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의Kwangyoun Jung
 
초보 프로그래머
초보 프로그래머초보 프로그래머
초보 프로그래머Yong Heui Cho
 
G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)Jake Yoon
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요Yongho Ha
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요KTH
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호KTH, 케이티하이텔
 
14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿유석 남
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌Seok-joon Yun
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택JinTaek Seo
 

Similar a HI-ARC PS 101 (20)

RNC C++ lecture_4 While, For
RNC C++ lecture_4 While, ForRNC C++ lecture_4 While, For
RNC C++ lecture_4 While, For
 
RNC C++ lecture_2 operator, if
RNC C++ lecture_2 operator, ifRNC C++ lecture_2 operator, if
RNC C++ lecture_2 operator, if
 
병렬 프로그래밍
병렬 프로그래밍병렬 프로그래밍
병렬 프로그래밍
 
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
[Td 2015]녹슨 c++ 코드에 모던 c++로 기름칠하기(옥찬호)
 
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
[TechDays Korea 2015] 녹슨 C++ 코드에 모던 C++로 기름칠하기
 
이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7이산수학 C1 프로젝트 7
이산수학 C1 프로젝트 7
 
[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary[C++ Korea 2nd Seminar] C++17 Key Features Summary
[C++ Korea 2nd Seminar] C++17 Key Features Summary
 
C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2C++17 Key Features Summary - Ver 2
C++17 Key Features Summary - Ver 2
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의문과생 대상 파이썬을 활용한 데이터 분석 강의
문과생 대상 파이썬을 활용한 데이터 분석 강의
 
초보 프로그래머
초보 프로그래머초보 프로그래머
초보 프로그래머
 
G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)G+ Summer C Study 20130709(3일차)
G+ Summer C Study 20130709(3일차)
 
06장 함수
06장 함수06장 함수
06장 함수
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
 
H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요H3 2011 파이썬으로 클라우드 하고 싶어요
H3 2011 파이썬으로 클라우드 하고 싶어요
 
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
H3 2011 파이썬으로 클라우드 하고 싶어요_분산기술Lab_하용호
 
이산수학07
이산수학07이산수학07
이산수학07
 
14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿14장 - 15장 예외처리, 템플릿
14장 - 15장 예외처리, 템플릿
 
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌[C++ Korea] Effective Modern C++ Study item14 16 +신촌
[C++ Korea] Effective Modern C++ Study item14 16 +신촌
 
Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택Boost라이브러리의내부구조 20151111 서진택
Boost라이브러리의내부구조 20151111 서진택
 

Más de Jae-yeol Lee

[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발Jae-yeol Lee
 
Browser Engineering - Ch1 Summary
Browser Engineering - Ch1 SummaryBrowser Engineering - Ch1 Summary
Browser Engineering - Ch1 SummaryJae-yeol Lee
 
HI-ARC PS 102 Bitmask
HI-ARC PS 102 BitmaskHI-ARC PS 102 Bitmask
HI-ARC PS 102 BitmaskJae-yeol Lee
 
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)Jae-yeol Lee
 
HI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithmHI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithmJae-yeol Lee
 
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화Jae-yeol Lee
 
HI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSHI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSJae-yeol Lee
 
HI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfsHI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfsJae-yeol Lee
 
[APL OJT] REST API TEST
[APL OJT] REST API TEST[APL OJT] REST API TEST
[APL OJT] REST API TESTJae-yeol Lee
 
Embedded project presentation
Embedded project presentationEmbedded project presentation
Embedded project presentationJae-yeol Lee
 

Más de Jae-yeol Lee (11)

[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
[PyCon KR 2023 Lightning talk day1] 개밥먹기 주도 개발
 
Browser Engineering - Ch1 Summary
Browser Engineering - Ch1 SummaryBrowser Engineering - Ch1 Summary
Browser Engineering - Ch1 Summary
 
Whats new rails 7
Whats new   rails 7Whats new   rails 7
Whats new rails 7
 
HI-ARC PS 102 Bitmask
HI-ARC PS 102 BitmaskHI-ARC PS 102 Bitmask
HI-ARC PS 102 Bitmask
 
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
HI-ARC ACM ICPC TF #5 (ADVANCED DFS)
 
HI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithmHI-ARC ACM-ICPC 준비반 - KMP algorithm
HI-ARC ACM-ICPC 준비반 - KMP algorithm
 
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
Github + Heroku + Circle CI 를 이용한 Django Application 배포 자동화
 
HI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFSHI-ARC 정기모임 #7 BFS
HI-ARC 정기모임 #7 BFS
 
HI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfsHI-ARC 정기모임 #6 dfs
HI-ARC 정기모임 #6 dfs
 
[APL OJT] REST API TEST
[APL OJT] REST API TEST[APL OJT] REST API TEST
[APL OJT] REST API TEST
 
Embedded project presentation
Embedded project presentationEmbedded project presentation
Embedded project presentation
 

Último

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Kim Daeun
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Wonjun Hwang
 
[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and AdoptionSeung-chan Baeg
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionKim Daeun
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'Hyundai Motor Group
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)Tae Young Lee
 

Último (7)

Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
Continual Active Learning for Efficient Adaptation of Machine LearningModels ...
 
캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차캐드앤그래픽스 2024년 5월호 목차
캐드앤그래픽스 2024년 5월호 목차
 
Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)Grid Layout (Kitworks Team Study 장현정 발표자료)
Grid Layout (Kitworks Team Study 장현정 발표자료)
 
[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption[Terra] Terra Money: Stability and Adoption
[Terra] Terra Money: Stability and Adoption
 
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution DetectionMOODv2 : Masked Image Modeling for Out-of-Distribution Detection
MOODv2 : Masked Image Modeling for Out-of-Distribution Detection
 
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
도심 하늘에서 시속 200km로 비행할 수 있는 미래 항공 모빌리티 'S-A2'
 
A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)A future that integrates LLMs and LAMs (Symposium)
A future that integrates LLMs and LAMs (Symposium)
 

HI-ARC PS 101

  • 1. HI-ARC 정기모임 #1 (Problem Solving 101) 이재열(@kodingwarrior), 김민균(@brandon)
  • 2. 본 강의는 Problem Solving 중심입니다. 필요한 만큼만 C++ 를 다루므로 유의바랍니다.
  • 3. Table Of Contents ● PS 101 ● Basic input, output ● Variable, Type
  • 4. PS - Problem Solving Alias for Competitive Programming - 직역하면 경쟁적인 프로그래밍 - 프로그래밍 대회를 위한 프로그래밍 - C++, Java - Time Limit (1s, 2s, ..) - Space Limit (256MB, 512MB, … )
  • 5. 프로그래밍 대회 시간 안에 (3시간~5시간) 빠르게 많이 풀어야 한다.
  • 6. 프로그래밍 대회 문제 예시 https://algospot.com/judge/problem/read/QUADTREE 문제를 푸는 사람에게 어떻게 풀이를 해야할 지 단서를 주는 문제에 대한 설명 (description) Description
  • 7. 프로그래밍 대회 문제 예시 https://algospot.com/judge/problem/read/QUADTREE 각각의 독립적인 Test Case (하나일 수도 있음), 입력에 대한 전제조건, 문제를 해결하는데 필요한 입력 (조건), 문제를 적절한 방법으로 해결했을때 나타날 수 있는 출력(결과) Input & Output
  • 8. 프로그래밍 대회 문제 예시 https://algospot.com/judge/problem/read/QUADTREE 어떻게 문제를 풀 든 정답은 없지만, 시간 제한과 메모리 제한을 맞춰야 한다. 알고리즘을 어떻게 효율적으로 짜느냐가 관건
  • 9. Feynman의 문제 해결법 1. 칠판에 문제를 적는다. 2. 골똘히 생각한다. 3. 칠판에 답을 적는다.
  • 10. 프로그래밍 대회 문제를 풀 때 접근 방식 1. 문제의 Description 을 이해한다. 2. 문제를 어떻게 해결할지 고민해본다. a. 코드를 막 짜거나, 문제를 쪼개서 생각해보거나, 시스템 자원을 최대한 쥐어짜거나, ... 3. 프로그램으로 구현해본다. 4. 더 나은 해답은 없는지 고민한다.
  • 11. Non-Feynman Solution 우리는 리처드 파인만처럼 똑똑하지 않기 때문에 이 방법을 써야할 수도 있습니다 1. 문제를 일단 읽어본다. 2. 어떻게 해결해야할 지 모르겠다면 주변 사람들한테 물어본다. a. HI-ARC 슬랙 #qna-ps 채널에 물어본다. (가장 빠름) b. BOJ 슬랙 #qna 채널 혹은 BOJ 게시판에 물어본다. (좀 느릴 수도 있음) c. 문제와 관련된 이슈를 다루는 블로그 포스트를 본다. (빠를 수도 있고, 느릴 수도 있음) 3. 답을 받아서 적는다. 4. 다음에 문제를 해결할 때는 답을 보지 않아도 해결할 수 있도록 노력한다.
  • 13. 시작하기에 앞서.. Q. C++ 하려면 C 에 대한 기초지식이 있어야 한다는데 사실인가요? A. C 에 대한 배경지식을 깔고 가야한다고 주장하는 C++ 책은 낡은 도서라 생각하면 됩니다. (높은 확률로 C++98 버전 기준으로 쓰인 낡은 책일 듯) 우리는 Modern C++(C++11 이상) 로 시작할 겁니다. 교과과정에서 C 를 배운다면 역사책 탐험하는 느낌으로 보는게 좋을 듯 관련 글 : http://minjang.github.io/2016/03/21/talk-with-stroustrup/ (C++ 창시자 비야네 스트로스트룹 이 "C++ 배우는데 C를 먼저 배울 필요 없어요" 라고 직접 말함)
  • 14. Basic Input/Output PS 의 기본은 화면에 결과물을 찍어내는 것에서부터 시작한다. #include <iostream> using namespace std; int main() { cout << “hello world!” << endl; return 0; } Output: hello world! #include <cstdio> int main() { printf(“hello world!”); return 0; } C++ Style C99 Style
  • 16. (별첨) #include <iostream> 이 낯설어요! 입출력을 위해 사용하는 여러가지 함수, 클래스 들을 가져오기 위해 사용합니다. 출력을 위해 사용되는 입출력 클래스의 인스턴스인 cin, cout 을 이용하려면 cin, cout 이 먼저 선언되어 있어야 합니다. iostream 헤더파일은 입출력에 필요한 여러 클래스들이 선언되어 있으며, #include 를 통해 iostream 헤더파일을 소스코드에 포함하게 되면, cin, cout 을 불러올 수 있게 됩니다.
  • 17. (별첨) #include 명령을 실행했을 때 생기는 일 출처 : https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a00911_source.html #include <iostream> using namespace std; int main() { cout << “hello world!” << endl; return 0; }
  • 18. (별첨) using namespace std 가 뭘 의미하나요? #include <iostream> 으로 불러오는 cin, cout, endl 의 풀 네임은 std::cin, std::cout, std::endl 인데, std 라는 namespace 를 디폴트로 사용하기 위해 using namespace std 명령을 이용합니다. ● namespace 는 왜 이용하나요? 프로그램이 복잡해지다보면 변수나 함수를 용도별로 묶고 싶을 때도 있고, 어떤 프로젝트에서 사용하는 변수나 함수인지 구분하고 싶을 경우도 있습니다. 편의상으로 변수 이름을 막 짓다보면 name conflict 가 발생할 수도 있지만, namespace 를 이용하면 그나마 name conflict 의 위험을 최소화 할 수 있습니다. std 라는 namespace 로 구분된 변수, 함수, 클래스는 C++ Standard 에서 지원합니다.
  • 19. (별첨) int main(...) {...} 이 낯설어요! ● main 함수는 C 프로그램이 실행될 때 가장 먼저 호출되는 함수입니다. ● main 함수는 int 라는 타입을 가지며, 소괄호( ‘()’ ) 안에 값(매개변수) 이 들어가기도 하지만 PS 에서는 신경쓰지 않아도 됩니다. ● 중괄호 안에는 함수를 호출하고 나서 순서대로 실행할 여러가지 명령을 나열해야 합니다. ● main 함수를 빠져나올 때, 즉, 프로그램을 종료할 때는 return 명령을 적습니다. ● 함수에 대해서 나중에 다시 다룰 예정
  • 20. (별첨) 나중에 이해해도 괜찮습니다. 1. 프로그램 실행 2. C 의 스타트업 루틴에서 main 함수 호출 3. main 함수에서 적당히 여러가지 명령을 실행 (사용자 정의함수를 호출할 수도 있음) 4. main 함수에서 return 을 통해 빠져나오게 되면 프로그램 종료
  • 21. Basic I/O 문자열(String) 뿐만이 아니라, 정수형 자료, 실수형 자료, 이외 다른 자료형까지 출력할 수 있다! #include <iostream> using namespace std; int main() { cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl; // “단체명 : HI-ARC / 창설연도 : 2017 / 평균연령 : 22.7” return 0; }
  • 22. (별첨) cout 의 동작원리가 궁금해요! cout 으로 출력을 수행하고나서, 다시 연쇄적으로 출력 연산이 이루어 집니다. cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl; // 출력결과 : “” cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl; // 출력결과 : “단체명 : HI-ARC / 창설연도 : ” 출력 준비 중 cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl; // 출력결과 : “단체명 : HI-ARC / 창설연도 : 2017” 출력 준비 중 cout << “단체명 : HI-ARC / 창설연도 : ” << 2017 << “ / 평균연령 : ” << 22.7 << endl; // 출력결과 : “단체명 : HI-ARC / 창설연도 : 2017 / 평균연령 : ” 출력 준비 중
  • 23. (별첨) endl 는 무엇을 의미하나요? std::endl 는 cout 으로 출력을 할 때 개행(줄바뀜) 문자 역할을 합니다. (end line 으로 기억하면 편함) #include <iostream> using namespace std; int main() { cout << “강한친구 대한육군”; cout << “강한친구 대한육군”; return 0; } #include <iostream> using namespace std; int main() { cout << “강한친구 대한육군” << endl; cout << “강한친구 대한육군”; return 0; } Output: 강한친구 대한육군강한친구 대한육군 Output: 강한친구 대한육군 강한친구 대한육군
  • 24. C++ 프로그래밍을 처음 배울때는 계산기를 만든다는 느낌으로 접근하자 ● + : 두 수를 덧셈한 결과 ○ 2 + 3 == 5 ● - : 왼쪽의 피연산자에서 오른쪽의 피연산자를 뺀 결과 ○ 6 - 3 == 3 ● * : 두 수를 곱셈한 결과 ○ 2 * 3 == 6 ● / : 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 결과 ○ 10 / 3 == 3 ● % : 왼쪽의 피연산자에서 오른쪽의 피연산자를 나눈 나머지 (정수형만) ○ 7 % 2 == 1
  • 25. Problem 나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다. Scenario 1 을 입력한다. (1이라는 결과가 저장) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) 2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) … 5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.)
  • 26. Problem 나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다. Scenario 1 을 입력한다. (1이라는 결과가 저장) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) 2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) … 5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.) printf(“%d”, 1+2+3+4+5); <- 이건 전혀 바람직하지 않음
  • 27. Problem 나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다. Scenario 1 을 입력한다. (1이라는 결과가 저장) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) 2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) … 5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.) printf(“%d”, 1+2+3+4+5); <- 이건 전혀 바람직하지 않음 중간 결과를 저장할 어떤 메모리 장소가 필요함.
  • 28. Variable/Type 메모리에 어떤 데이터를 담을까? 1. 정수형 자료? 2. 문자열 자료? 3. 문자 하나로만 이루어진 자료? 4. 실수형 자료? 5. 여러가지 데이터가 섞여있는 자료? (구조체, 클래스, …)
  • 29. Memory Issue 컴퓨터의 메모리는 한계가 있고 (4GB, 8GB, 16GB, … , 1TB, … ) 메모리 공간을 모자라지도 않고 너무 남아돌지도 않게 효율적으로 잘 쥐어짜낼 수 있어야 한다. e.g. 1byte, 2byte, 4byte, 8byte, 2N * M byte
  • 30. Variable 메모리 공간을 적당히 확보해놓고, 확보해놓은 메모리 공간에 구분을 목적으로 이름을 부여한 것. int age; // 나이를 의미하는 정수형 변수 float average_score; // 평균 성적을 의미하는 실수형 변수 string name; // 이름을 의미하는 문자열 변수 Document resume; // 이력서를 의미하는 사용자 정의 변수
  • 31. Variable Example 정수형으로 사용하고 싶은 데이터가 있다. 4byte 만큼 메모리 공간을 확보했고, 그 메모리 공간에 44 라는 값을 넣을 것인가? int num = 44; // 대입 연산자(=) 를 이용하여 할당 44 암튼 메모리 어딘가에 있음 (정수 리터럴이라고도 함) Memory 44 라는 값을 num 으로 copy num
  • 32. Variable Example(2) 문자열로 사용하고 싶은 데이터가 있다. 얼마나 쓸 지 모르겠지만 메모리 공간을 확보했고, 그 메모리 공간에 “Hello world” 라는 값을 넣을 것인가? string text = “Hello world”;
  • 33. 복잡한 연산을 수행하고 싶다면 소괄호를 이용하도록!EX) 근의 공식 #include <iostream> #include <cmath> int main() { float a = 3; float b = 4; float c = 5; // 3x2 + 4x + 5 cout << ((-b) + sqrt(4*a*c)) / (2*a) << endl; return 0; } 명령의 실행을 구분할 때는 ; (세미콜론) 으로 구분해야 합니다.
  • 34. QUIZ. 어느 쪽이 정상적으로 돌아갈까요? (다중 선택) #include <iostream> using namespace std; int main() { int num1 = 4; int num2 = 5; cout << num1 + num2; return 0; } #include <iostream> using namespace std; int main() { cout << num1 + num2; return 0; } #include <iostream> using namespace std; int main() { int num1, num2; cout << num1 + num2; return 0; }
  • 35. ANSWER. 변수를 이용하기 전에 선언은 무조건 해놓자. #include <iostream> using namespace std; int main() { int num1 = 4; int num2 = 5; cout << num1 + num2; return 0; } #include <iostream> using namespace std; int main() { cout << num1 + num2; return 0; } #include <iostream> using namespace std; int main() { int num1, num2; cout << num1 + num2; return 0; } 선언 조차 안 되어있어 어떤 값을 더하고자 하는지 알 수 없음 선언은 했지만, 어떤 값이 들어있는지 알 수 없음 (쓰레기값이 들어감) ? 결과가 9 라는 것을 알 수 있음
  • 36. Type 컴퓨터에서는 데이터를 이진수로 나타내게 됨. 할당해놓은 메모리 공간 내에서 가질 수 있는 값의 범위. ex) 101 을 이진수로 나타내기 (int) 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 1 231 230 229 228 227 226 225 224 223 222 221 220 219 218 217 216 215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 101 = 26 (64) + 25 (32) + 22 (4) + 20 (1)
  • 37. 자료형 정리 bool : true / false 둘 중 하나만 가질 수 있는 값 char : 1byte(8bit). -128 ~ 127 까지의 값을 가질 수 있음 short : 2byte(16bit). -215 ~ 215 -1 까지의 값을 가질 수 있음 int : 4byte(32bit). -231 ~ 231 -1 까지의 값을 가질 수 있음 long long : 8byte(64bit). -263 ~263 -1 까지의 값을 가질 수 있음 float : 4byte(32bit). Sign bit(1) + exponential(8) + mentissa(23) double : 8byte(64bit). Sign bit(1) + exponential(11) + mentissa(52) 실수형에 대한 정보는 Wikipedia 혹은 IEEE 754 를 참고
  • 38. 다시 Basic I/O(cin/cout) 정수형으로 사용하고 싶은 데이터가 있다. 4byte 만큼 메모리 공간을 확보했고, 사용자의 입력을 받아서 그 메모리 공간에 어떻게 값을 넣을 것인가? #include <iostream> using namespace std; int main() { int num; cin >> num; cout << num; return 0; } Input: 3 Output: 3
  • 39. 다시 Basic I/O(cin/cout) 문자열로 사용하고 싶은 데이터가 있다. 얼마나 사용할지 알 수 없지만 어쨌든 메모리 공간을 확보했고, 사용자의 입력을 받아서 그 메모리 공간에 어떻게 값을 넣을 것인가? #include <iostream> #include <string> using namespace std; int main() { string s; cin >> s; cout << s; return 0; } Input: HI-ARC Output: HI-ARC
  • 40. 연습문제 ● A + B : https://www.acmicpc.net/problem/1000 ● A - B : https://www.acmicpc.net/problem/1001 ● A * B : https://www.acmicpc.net/problem/10998 좀 난이도 있게 가보고 싶다면 이런 것도 해보세요. ● 폰노이만과 파리 : https://www.acmicpc.net/problem/14924
  • 41. Back to the problem 나는 계산기처럼 쓸 수 있는 간단한 프로그램을 원한다. Scenario 1 을 입력한다. (1이라는 결과가 저장) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) 2 을 입력한다. (저장한 결과에 2를 더함. 결과적으로 3이 저장됨) + 를 입력한다. (+ 연산의 결과가 이루어질 것이라고 가정) … 5 를 입력한다. (저장한 결과에 5를 더함. 결과적으로 15가 저장됨.)
  • 42. Solution #include <iostream> using namespace std; int main() { int A, B, C, D, E cin >> A >> B >> C >> D >> E; cout << A + B + C + D + E; return 0; }
  • 43. (부록) printf/scanf 주어진 형식에 맞게 입출력을 하는데 쓰이는 함수. #include <cstdio> int main() { int a = 1; float b = 2.33; long long c = 100000000000; char[] d = “asdsadadadadadadsa”; char e = ‘h’; printf(“%d %f %lld %s %c”, a, b, c, d, e) } 각 인자에 대응되는 format placeholder Format placeholder 의 갯수만큼 추가적으로 인자를 넣을 수 있음
  • 44. (부록) printf/scanf 주어진 형식에 맞게 입출력을 하는데 쓰이는 함수. #include <cstdio> int main() { int a; float b; long long c; char d[10]; char e; scanf(“%d %f %lld %s %c”, &a, &b, &c, &d, &e) } 각 인자에 대응되는 format placeholder Format placeholder 의 갯수만큼 추가적으로 인자를 넣을 수 있음 뒤에 따라오는 인자에는 변수가 위치한 메모리상의 주소가 들어가야함
  • 45. (부록) printf/scanf Type 에 따른 format placeholder 표기법 정리 %c char 를 입출력 %d int 를 입출력 %ld long 을 입출력 %lld long long 을 입출력 %f float, double 를 입출력 %lf long double 을 입출력 %s C 에서 취급하는 문자열 을 입출력 (null 로 끝나는 문자열) %x 정수형 변수(unsigned int) 를 헥사표기법(16진법)으로 출력(소문자) %X 정수형 변수(unsigned int) 를 헥사표기법으로 출력(대문자) %e 실수형 변수를 유효숫자 표기법으로 출력 %a 실수형 변수(unsigned double) 를 헥사표기법(16진법)으로 출력(소문자) %A 실수형 변수(unsigned double) 를 헥사표기법(16진법)으로 출력(소문자)
  • 46. 입출력과 관련된 여러가지 예제는 직접 찾아보길 권장EX) 입력을 받지 않을 때까지 계속해서 읽어들이기, 한글자 한글자 읽어들이기, ... 입출력과 관련된 다양한 예제는 (자체검열) 에서 다룰 예정입니다. HI-ARC 위키에서 “C/C++ 입출력 정리” 문서를 검색하세요
  • 47. 뭔가 많이 배운 것 같죠? 지금 당장 다 흡수하려고 할 필요까지는 없습니다. 코딩하다보면 이런 것들을 상식으로 생각하는 선까지 오게 됩니다. 초조해하지말고 배우는 과정을 즐기시길 바랍니다 :)
  • 48. 다음 주는 if/else 문 사용법을 간단하게 짚고 넘어가겠습니다.