기초내용을 복습해볼겸 교수님이 운영하시는 주니온TV를 보고 내용을 정리해보았다.
vscode로 cpp코딩하는법은 이 글을 보고 따라해보자
#include <iostream>
int main() {
int n;
std::cout << "Input an integer : " << std::endl;
std::cin >> n;
std::cout << n << std::endl;
}
이렇게하면 입출력이 된다는것은 모두가 알 것이다.
근데 가끔 알고리즘 문제를 풀다보면 시간초과가 발생한다. 왜?
cout, cin, endl이 시간이 많이 걸리기때문이라고 한다.
그런 경우 몇가지 해결책이 있는데
자바에서 사용하던 scanf, printf를 사용하는 방법이 있다.
이때 헤더파일은 iostream이 아니라 stdio를 사용하여야 한다.
std::endl 대신
std::cout << "ABCDE" << "\n";
개행문자 \n을 사용하여 끝내는 방법이 있다.
std::ios::sync_with_stdio(false);
std::cin.tie(NULL);
std::cout.tie(NULL);
이걸 사용해서 해결할 수 있다.
이 사례는 백준 빠른 a + b, 하노이 탑 에서 체험해 볼 수 있다. 실제 코테에서도 이런 케이스가 나올지는 잘 모르겠다.
함수호출방식과 관련된 이야기를 잠깐 해보겠다.
value는 말 그대로 값을 불러와서 쓰는 함수이고, reference는 참조, 좀 다르게 말하면 주소(?)를 불러와서 쓰는 개념이다.
이 예시를 한번 보겠다.
#include <iostream>
void call_by_value(int a, int b);
void call_by_ref(int &a, int &b);
int main() {
int a = 5;
int b = 10;
std::cout << "call by value : " << "\n";
call_by_value(a, b);
std::cout << a <<", " << b << "\n";
std::cout << "call by ref : " << "\n";
call_by_ref(a, b);
std::cout << a <<", " << b << "\n";
}
void call_by_value(int a, int b) {
int temp;
temp = a;
a = b;
b = temp;
}
void call_by_ref(int &a, int &b) {
int temp;
temp = a;
a = b;
b = temp;
}
이렇게 코딩을 하면, call by value에서는 자기 내부에서만 int a, int b값을 받아서 처리한거라 값이 변하지 않지만,
call by ref 에서는 레퍼런스를 받아와서 처리한거라 값 변경이 넘어온것을 알 수 있다.
def counter():
cnt += 1
cnt = 0
for _ in range(10):
counter()
print(cnt)
이런 코드가 있다면, cnt는 결과적으로 하나도 오르지 않는다. cnt값은 immutable이라서 def 에서 별도 선언을 하지 않는이상 def 내에서 새로운 값이 생성되어서 쓰이는것이다.
그래서 이를 해결하기 위해서 쓰는게 global이다.
cnt = 0
def counter():
global cnt
cnt += 1
for _ in range(10):
counter()
print(cnt)
이렇게 글로벌 선언을 해주면 cnt값은 해당 파일 전체의 영향을 미치는 코드가 된다.
cpp에도 이거랑 비슷한 기능이 있다.
#include <iostream>
int cnt;
void counter() {
cnt++;
}
int main() {
for (int i = 0; i < 10; i++) {
counter();
}
std::cout << cnt << "\n";
}
이렇게 해주면 된다!