간단한 swap 함수를 작성하였습니다. void fnSwap(int& first, int& second) { int temp = first; first = second; second = temp; } 사용은 별도로 참조형을 선언한다든지 할 필요 없이, 다음과 같이 변수를 직접 파라미터로 사용합니다. int a{10}, b{20}; fnSwap(a, b); 참조형을 입력 인자로 넣을 때도 마찬가지입니다. int a{10}, b{20}; int &ra{a}, &rb{b}; fnSwap(ra, rb); 즉, 참조형으로 선언된 파라미터는 원본을 전달하라는 의미로 컴파일러가 이해를 하고 있다고 알고 있으면 됩니다. 따라서 포인터 변수를 이용하여 위 함수를 호출할 경우라도 어렵게 생각하지 않고 우리가 적용하려고 하..
C++
개요 printf와 같이 서식을 사용하여 문자열을 초기화 하고자 합니다. 본문 코드 // myString.cpp #include #include #include #include class myString : public std::string { public: myString(const std::string fmt, ...); }; myString::myString(const std::string fmt, ...) { va_list args, argtmp; va_start(args, fmt); va_copy(argtmp, args); int len = vsnprintf(nullptr, 0, fmt.c_str(), argtmp); char *buf = new char[len]; if (buf!=nullptr..
문제 (요약) 주어진 수열이 문제에서 정의한 순열인지 판단하라. 길이 N인 순열은 1부터 N까지의 자연수를 중복 없이 순서에 상관없이 모두 사용하여 만든 수열을 의미한다. 접근 입력된 수열을 검사하여 모두 1회씩 출현했는지 확인한다. 풀이 #include #include using namespace std; string fnSolve(vector &v, int N) { for (int i = 1; i > T; for (int t = 1; t > N; vector v(N+1); for (int i = 0; i > idx; v[idx] += 1; } cout
개요 단일 연결 리스트는 한쪽 방향으로 연결된 노드로 구성됩니다. 따라서 액세스 및 순회는 첫 번째 노드인 Head에서 시작하여 한번에 한 노드씩 확인하며 진행해야 합니다. 만약 역순으로 액세스 및 순회를 하고자 한다면 이를 효율적으로 할 수는 없을 것입니다. 순회를 위하여 매번 Head에서 시작하여 이전 순회보다 한 노드씩 앞에서 중단하는 방식으로 여러 차례 반복적으로 순회를 수행해야 하기 때문입니다. 따라서 만약 역순으로 순회를 해야 하는 경우가 필요하다면 이번 포스트에서 소개하는 이중 연결리스트(Doubly Linked List)를 도입하는 것이 좋습니다. 구현 (C++) 이중 연결 리스트 각 노드는 3가지 멤버변수를 가지고 있습니다. 두 가지는 각각 이전 노드와 다음 노드를 가리키는 링크 값(포인..
문제 (요약) 주어진 입력에서 고른 두 수의 곱을 출력하라. 이 곱은 증가하는 연속숫자(예, 2, 23, 23456, 456 등)로 이루어져야 한다. 이 값이 여러 개인 경우 최댓값을 출력하고 조건에 맞도록 두 수를 고를 수 없을 경우 -1을 출력하라 접근 입력으로 10^3개 이하의 수열이 주어지므로 이들을 조합하여 곱을 구하면 10^6 개의 곱을 얻고 이들 값이 각각 조건을 만족하는지 확인하면 된다. 이는 충분히 작은 숫자이므로 전수조사(O(N^2))로 풀이할 수 있다. 풀이 #include #include #include FILE* stream; using namespace std; int T, N; int main(void) { cin >> T; for (int t = 1; t > N; vector..
개요 여러 언어에서 기본적으로 제공하는 자료구조인 배열은 특정 순서로 무언가 저장하기에 좋고 간단하지만 단점이 있습니다. 배열은 유연하지 않습니다. 예를 들어, 배열의 크기를 미리 지정해야 하며, 프로그램의 동작 중에 그것을 수정하는 것은 매우 어렵습니다. (이 단점은 C++의 표준 템플릿 라이브러리(STL, Standard Template Library)인 벡터(Vector)에서 해결됩니다.) 또한 요소의 삽입 및 삭제가 어렵습니다. 삽입을 위한 공간을 확보하거나 삭제 후 빈 공간을 채우기 위해 나머지 요소를 좌/우로 이동해야 합니다. 이번 포스트에서는 연결리스트(Linked List)라고 하는 중요한 자료구조의 구현을 살펴보겠습니다. 가장 간단한 형태의 연결 리스트는 한 방향으로 연결된 리스트로 리스..
표준 입력 (cin) 대부분의 프로그램 환경에서 표준 입력의 기본값은 키보드입니다. C++ 스트림 객체가 이에 접근할 수 있도록 정의한 것이 cin입니다. C++에서 지원하는 기본 자료형은 추출 연산자 (>>)를 사용하여 사용자의 키보드 입력을 프로그램에서 얻을 수 있습니다. int n, q; cin >> n >> q; cin과 문자열(strings) 기본 자료형과 동일하게 추출 연산자 (>>)를 써서 cin에서 문자열을 얻을 수 있습니다. // cin with strings #include #include using namespace std; int main () { string myName; cout myName; cout
개요 C++ Standard Template Library의 vector 사용법을 학습합니다. 문제 출처 : Variable Sized Arrays | HackerRank 문제 요약 주어진 입력을 바탕으로 가변 길이의 배열들을 만들고, Query에 따라 각 배열의 원소를 화면에 출력하라. 예시 입력 2 2 // Array 2개, Query 2건 3 1 5 4 // 0번째 Array는 원소가 3개, 각 원소는 1,5,4 5 1 2 8 9 3 // 1번째 Array는 원소가 5개, 각 원소는 1,2,8,9,3 0 1 // 첫번째 Query 0번째 Array의 1번째 Index의 원소를 출력하라 1 3 // 두번째 Query 1번째 Array의 3번째 Index의 원소를 출력하라 예시 출력 5 9 풀이 #in..