티스토리 뷰

c++ 연습 문제 풀이 첫 포스팅이다!

 

그 동안 C++ 은 매번 문법을 눈으로만 이해하고, 응~ 어쩔 자바, 어쩔 파이썬, 어쩔 C#~ 이러면서 연습은 1도 안하는 바람에... 머리 속에 있는 C++ 기본 개념들이 완전 엉망진창이 되었다.

 

요즘은 언리얼이 대세라고 하여, 언리얼 엔진을 좀 공부해볼까 하는데, C++ 공부도 다시 해야할 거 같고... 코딩 테스트 문제들도 좀 풀면서 머리를 말랑말랑하게 만들 필요가 있을 거 같아서 시작해보려고 한다.

 

참고 문헌은 "코딩 테스트를 위한 자료구조와 알고리즘 with C++" 이며, 책을 보면서 옵시디언 메모장에 한 번 정리한 이후에 마크다운 문서를 블로그에 옮겨 적는 거라 조금 어색할 수가 있는데, 최대한 잡아보겠다.


Q1. 학교에서 학생 정보를 관리하는 간단한 응용 프로그램을 만들어보자.

input: 한 반의 학생 수와 학생의 이름과 나이
output: 입력 받은 배열과 배열 복사, 합치기 함수의 결과

 

전체 코드 작성에 필요한 사전 문법 지식들은 아래와 같다.


https://til-choonham.tistory.com/465 

https://til-choonham.tistory.com/467

 

[C++] 문법: Class member 함수를 const와 非const를 따로 선언하는 이유

C++에서 클래스 멤버 함수의 `const` 버전을 추가하는 경우는 주로 해당 함수가 객체의 상태를 변경하지 않음을 명시하고 싶을 때입니다. 이는 객체의 멤버 변수를 수정하지 않는 "읽기 전용" 함수

til-choonham.tistory.com

https://til-choonham.tistory.com/466

 

[C++] 문법: 포인터 변수와 참조

C++에서 포인터 변수와 참조(reference)는 서로 다른 개념이며, 이 두 가지 방식은 변수에 접근하고 조작하는 방법에서 차이가 있다. 포인터 변수 (Pointer Variables) 1. 정의: 포인터는 변수의 메모리 주

til-choonham.tistory.com

https://til-choonham.tistory.com/468

 

[C++] 문법: 참조 변수와 포인터 변수의 사용 목적 차이

T& at(int index) { if(index < n) { return data[n]; } throw "out of range"; } 와 T* begin() { return data; } const T* begin() const { return data;} T* end() { return data + n; }; const T* end() const { return data + n; } 의 차이점은 뭘까? 둘 다

til-choonham.tistory.com


 

전체 코드와 주석

#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;  
}
Comments