C++

    [실2] 1406 - 에디터

    #include #include #include #include #include #include #include using namespace std; list my_list; auto iter = my_list.end(); int count = 0; void Move_left() { if (iter != my_list.begin()) iter--; } void Move_right() { if (iter != my_list.end()) iter++; } void Delete() { if (iter == my_list.begin()) return; iter = my_list.erase(--iter); } void Add(char _letter) { my_list.insert(iter, _letter); } ..

    [실1] 1926 - 그림

    #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define MAX_SIZE 502 int board[MAX_SIZE][MAX_SIZE]; bool visited[MAX_SIZE][MAX_SIZE]; int n = 0, m = 0; int dx[4]{ 1, 0, -1, 0 }; int dy[4]{ 0, 1, 0, -1 }; int main() { cin >> n >> m; for (int i = 0; i > board[i][j]; } int mx = 0; //..

    [실1] 2178 - 미로탐색

    특이사항) 좌표 (1,1)부터 (y,x)까지 이동하라는데 (1,1)부터 시작 시 로직이 복잡해지므로 (0,0)부터 시작 #include #include #include #include using namespace std;#define FAST_IO() ios::sync_with_stdio(0); cin.tie(0);#define y first#define x secondusing IntPair = pair;IntPair dir[]{ {1, 0}, // 상 {-1, 0}, // 하 {0, -1}, // 좌 { 0, 1 }, // 우};vector> map, dist;queue q;int y, x, cnt;void Bfs(){ while (!q.empty()) { auto cur = q.front..

    C++ 그래프를 이용한 BFS / DFS 계속 업데이트할 예정

    출처 : https://www.youtube.com/watch?v=tWVWeAqZ0WU 첫번째 문제 #include #include #include #include #include using namespace std; #define TOTAL_SIZE 1000 #define y first #define x second vector graph[TOTAL_SIZE]; bool visited[TOTAL_SIZE]{ false }; int edge = 0; void DFS(int _start) { cout

    이터레이터 Iterator (반복자)

    컨테이너에 저장되있는 원소들을 공통적인 방법으로 하나씩 접근할 수 있게 해줌. 모든 컨테이너들이 다 같은 방법으로 반복자 사용 가능. 각 타입에 ::iterator 또는 ::const_iterator 를 뒤에 붙여주면 사용이 가능하다. vector 컨테이너의 반복자 itr vector::iterator itr; vector 컨테이너의 const한 반복자 citr vector::const_iterator citr; 포인터와 비슷하게 사용한다. 간접 참조 가능) itr = v.begin() + 2 에서 *itr 간접 참조를 하면 세번째 원소 값이 리턴된다. iterator 와 const_iterator 의 차이 const_iterator 는 반복자가 가리키는 원소의 값을 변경하지 못한다. 반복자 값이 변경되..

    C++ 예외 처리용 throw(), noexcept()

    throw(typeid, typeid, ...) throw 한정자는 함수가 예외로 던질 수 있는 typeid의 목록을 인자로 받는다. typeid에 해당하는 타입이 클래스나 구조체라면, 상속받는 자식도 역시 예외를 던질 수 있는 타입으로 간주한다. // 아무 타입도 지정하지 않았으므로, 예외를 던지지 않는다. void no_except() throw(); // 모든 타입에 대해 예외를 던진다 void bar() throw(...) {}; // C++11부터 추가된 parameter pack, 즉 C++11 이전엔 이 형태가 불가능 void baz() {}; class X {}; class Y {}; class Z : public X {}; class W {}; // 함수 f는 X와 Y, 그리고 그들의 자..

    C++ 전방 선언 (Forward Declaration)

    외부 파일 어딘가에 해당 클래스가 존재한다고 알려주는 역할 다양한 파일들을 만들고 서로 엮는 과정에서 불필요한 파일의 정보까지 가져오는 상황이 발생한다. 이를 해결하기 위해서 전방 선언을 사용하는 것이 좋다. #include와 전방 선언의 차이점 #include 기존에 존재하는 정보를 확인할 수 있다. 전방 선언 어딘가에 존재한다는 것을 알 수 있지만 상세한 정보는 알 수 없다. 전방 선언의 장점 #1. 파일의 크기가 작아진다.(컴파일 속도의 향상) 전방 선언 시 주의 사항 #1. 존재만 알려준다. 프로그램에서 전방 선언한 것이 존재하는지 검사를 하지 않는다. 오타가 발생할 경우 찾기 힘들다. #2. 존재만 알기 때문에 객체를 만들 수 없다. 왜냐하면 정확한 크기를 알지 못해서이기 때문이다, 포인터 변수..

    C++ typename의 두 가지 의미

    템플릿의 타입 매개변수를 선언할 떄는 class와 typename의 뜻이 완전히 똑같다. 그렇다고 언제까지나 class와 typename이 C++ 앞에서 언제나 동등한 것만은 아니다. template void Print2nd( const C& container) { if( container.size() >= 2 ) { C::const_iterator iter( container.begin() ); ++iter; int value = *iter; std::cout void Print2nd( const C& container ) { C::const_iterator* x; ... } 언뜻 보면, C::const_iterator에 대한 포인터인 지역 변수로서 x를 선언하고 있는 것 같지..

    C++ r-value && (임시 객체) / l-value & (고유 객체, 주소값)

    C++ Lvalue와 Rvalue에 대한 오해 Lvalue와 Rvalue는 보통 Left-value(왼쪽값)과 Right-value(오른쪽값)로 풀어서 쓴다. C 표준에서는 대입 연산자(=)를 기준으로 왼쪽과 오른쪽에 모두 사용될 수 있는 값은 Lvalue이고 오른쪽에만 사용될 수 있는 값이 Rvalue라고 정의하고 있지만 C++ 관점에서는 전혀 다른 관점에서 해석할 필요가 있다. Lvalue와 Rvalue의 구분 C++에서 모든 표현식은 Lvalue 또는 Rvalue이다. Lvalue는 단일 표현식 이후에도 없어지지 않고 지속되는 객체이다. 쉽게 생각해서 이름을 가지는 객체는 Lvalue라고 얘기할 수 있다. 그러므로 const 타입을 포함한 모든 변수는 Lvalue 이다. 반면에 Rvalue는 표현식..

    선 중 후 순회 트리

    #include using namespace std; #define SAFE_DELETE(x) if(x != nullptr) delete x; // 트리 구조체 typedef struct s_tree_node { char data; s_tree_node* p_left; // 왼쪽 노드에 대한 포인터 s_tree_node* p_right; // 오른쪽 노드에 대한 포인터 public: // 전위 순회 함수 static void Pre_order(s_tree_node* _p_root_node) { if (_p_root_node) { printf("%3c", _p_root_node->data); Pre_order(_p_root_node->p_left); Pre_order(_p_root_node->p_right..