티스토리 뷰
c++ 연습 문제 풀이 첫 포스팅이다!
그 동안 C++ 은 매번 문법을 눈으로만 이해하고, 응~ 어쩔 자바, 어쩔 파이썬, 어쩔 C#~ 이러면서 연습은 1도 안하는 바람에... 머리 속에 있는 C++ 기본 개념들이 완전 엉망진창이 되었다.
요즘은 언리얼이 대세라고 하여, 언리얼 엔진을 좀 공부해볼까 하는데, C++ 공부도 다시 해야할 거 같고... 코딩 테스트 문제들도 좀 풀면서 머리를 말랑말랑하게 만들 필요가 있을 거 같아서 시작해보려고 한다.
참고 문헌은 "코딩 테스트를 위한 자료구조와 알고리즘 with C++" 이며, 책을 보면서 옵시디언 메모장에 한 번 정리한 이후에 마크다운 문서를 블로그에 옮겨 적는 거라 조금 어색할 수가 있는데, 최대한 잡아보겠다.
Q1. 학교에서 학생 정보를 관리하는 간단한 응용 프로그램을 만들어보자.
input: 한 반의 학생 수와 학생의 이름과 나이
output: 입력 받은 배열과 배열 복사, 합치기 함수의 결과
전체 코드 작성에 필요한 사전 문법 지식들은 아래와 같다.
https://til-choonham.tistory.com/465
https://til-choonham.tistory.com/467
https://til-choonham.tistory.com/466
https://til-choonham.tistory.com/468
전체 코드와 주석
#include <array>
#include <sstream>
#include "iostream"
using namespace std;
template<typename T>
class dynamic_array {
T* data;
size_t n;
public:
/* 생성자 */
dynamic_array(int n) {
this -> n = n;
data = new T[n];
}
/* 복사 생성자 */
dynamic_array(dynamic_array<T>& copyData) {
n = copyData.n;
data = new T[n];
for(int i = 0; i < n; i++) {
data[i] = copyData[i];
}
}
/* 멤버 데이터에 직접 접근하기 위한 [] 연산자와 at() 함수 작성 */
T& operator[](int n) {
return data[n];
}
const T& operator[](int n) const {
return data[n];
}
T& at(int index) {
if(index < n) {
return data[n];
}
throw "out of range";
}
/* 배열의 크기를 반환하는 size 함수 */
const size_t size() const{
return n;
}
/* 소멸자 */
~dynamic_array() {
delete[] data;
}
/* 배열 원소를 순회할 때 사용할 반복자 관련 함수 정의 */
T* begin() { return data; }
const T* begin() const { return data;}
T* end() { return data + n; };
const T* end() const { return data + n; }
/* 두 배열을 하나로 합치는 연산을 수행하는 + 연산자 함수 정의 */
friend dynamic_array<T> operator+(const dynamic_array<T>& arr1, const dynamic_array<T>& arr2) {
dynamic_array<T> result(arr1.size() + arr2.size());
copy(arr1.begin(), arr1.end(), result.begin());
copy(arr2.begin(), arr2.end(), result.begin() + arr1.size());
return result;
}
/* 배열에 저장된 모든 데이터를 문자로 변환하는 to_string() 멤버 함수 반환 */
string to_string(const string& sep = ", ") {
if(n == 0) {
return "";
}
ostringstream os;
os << data[0];
for(int i = 0; i < n; i++) {
os << sep << data[i];
}
return os.str();
}
};
/* student 구조체 */
struct student {
string name;
int standard;
};
ostream& operator<<(ostream& os, const student& s) {
return (os<<"["<<s.name <<", "<<s.standard <<"]");
}
int main() {
int nStudents;
cout << "1반 학생 수를 입력하세요.";
cin >> nStudents;
dynamic_array<student> class1(nStudents);
for(int i = 0; i < nStudents; i++) {
string name;
int standard;
cout << i + 1 << "번째 학생 이름과 나이를 입력하세요.";
cin >> name >> standard;
class1[i] = student{name, standard};
}
auto class2 = dynamic_array(class1);
cout << "1반을 복사하여 2반 생성: " << class2.to_string() << endl;
auto class3 = class1 + class2;
cout << "1반과 2반을 합쳐 3반 생성" << class3.to_string() << endl;
return 0;
}
반응형
'C++ > 연습 문제' 카테고리의 다른 글
[C++] Binary Search Tree (0) | 2024.01.06 |
---|---|
[C++] Binary Tree: 순회 (1) | 2024.01.05 |
[C++] 연습 문제 2. 빠르고 범용적인 데이터 저장 컨테이너 구현 (0) | 2023.12.17 |
Comments
최근에 올라온 글
최근에 달린 댓글
TAG
- 인천 구월동 이탈리안 맛집
- redux
- await
- react
- 파니노구스토
- 인천 구월동 맛집
- react-native
- AsyncStorage
- redux-thunk
- Promise
- javascript
- Async
- 정보보안기사 #실기 #정리
- 맛집
- 이탈리안 레스토랑
- Total
- Today
- Yesterday