Machineboy空

C++ 기초 문법 다지기 예제 모음6 - 자료 구조 본문

Computer/Coding Test

C++ 기초 문법 다지기 예제 모음6 - 자료 구조

안녕도라 2024. 10. 25. 20:08

가장 단순한 형태의 프로그램은 변수에 데이터를 담는 것이다. 하지만 데이터를 리스트에 저장하거나, 이름/값 쌍으로 저장하거나 심지어는 이 두 가지의 조합을 사용하는 것에 대해 고민하게 될 것이다.

 

자료 구조는 여러분이 사용하는 프로그래밍 언어에 따라 다르겠지만, 대체로 배열(array), 리스트(list), 해시(Hash), 해시맵(hashmap), 사전(dictionary), 연관 배열(associative array), 맵(map) 등이 있다. 언어마다 다른 명칭을 사용한다 하더라도 그 의미와 개념은 같다. 자료 구조를 이용하여 데이터를 서로 묶을 수 있다. 

 

배열은 값을 순서대로 저장하는 자료 구조다.

colors = ["Red", "Green", "Blue"]

보통 배열에 들어 있는 아이템 순서는 고정되어 있다. 그래서 원하는 값을 찾기 위해서는 그 값에 해당하는 인덱스를 사용하면 된다.

 

맵은 키(key)와 값(value)로 구성된 자료구조로, 위치 값 대신 키 값을 이용하여 자료를 찾는다.

person = {name: "Homer", age: 42};

person["name"]

 

사용하는 언어에 따라 다르지만 기존의 자료 구조를 수정하는 것보다 배열을 하나 만드는 것이 더 안전하고 효율적이라는 것을 알게 될 것이다.


예제 33. Magic 8 ball

Magic 8 ball 게임은 사용자로부터 질문을 입력받아 이에 대한 답을 
"Yes", "No", "Maybe", "Ask again later" 등 중에서 무작위로 대답해주는 게임이다.
#include <iostream>
#include <cstdlib> 
#include <ctime>
using namespace std;

string q;
string answer[] = {"yes","no", "maybe", "ask again later"};
int randomNum = 6;

int main() {
	// 랜덤 시드 초기화라고 함
    srand(static_cast<unsigned int>(time(0)));

    getline(cin, q);

    randomNum = rand() % 4 ;
    
    cout  << answer[randomNum];
}


예제 34. 사원 명단 삭제

리스트 안에 있는 모든 사원 이름을 출력한 다음, 명단에서 삭제할 이름을 입력 받고 해당하는 이름을 제거한다. 그리고 나머지 명단을 한줄씩 출력한다.
#include <iostream>
#include <string>
using namespace std;

vector<string> employees;
string name;

int main() {
    cout << "There are 5 employees";
    for(int i = 0; i < 5; i++){
        cin >> name;
        employees.push_back(name);
    }

    cout << "Enter an employee name to remove:";
    cin >> name;

    for(int i = 0 ; i < employees.size(); i++){
        if(name == employees[i]) {
            employees.erase(employees.begin() + i);
        }
    }
    
    for(string pp : employees){
        cout << pp +"\n";
    }
}

https://life-with-coding.tistory.com/411

 

[C++][STL] Vector 기본 사용법 및 예제 활용

인트로 안녕하세요! 오늘은 C++ STL중 하나인 벡터(Vector)의 기본 함수와 예제에 대해서 알아보도록 하겠습니다. 벡터 기본함수는 push_back, pop_back, front, back, clear, begin, end, rbegin, rend, reverse 등이 있

life-with-coding.tistory.com


예제 35. 승자 선택

아무것도 입력하지 않을 때까지 대회 참가자 이름을 입력 받은 다음 이 중에서 무작위로 수상자를 선정한다.

예제 36. 통계 계산

평균값을 구하는 방법
1. 모든 값의 합계를 구한다.
2. 합계를 값의 개수로 나눈다.

표준편차를 구하는 방법
1. 각각의 값과 평균의 차를 구하고 이를 제곱한다.
2. 제곱한 값들의 평균을 구한다.
3. 이 평균에 루트를 씌운다.

웹사이트의 응답시간을 밀리초로 받는 프로그램을 작성하라. 사용자가 'done'이라고 입력할 때까지의 응답시간을 받는다. 
그 다음 평균 응답시간, 최소 응답시간, 최대 응답시간, 표준편차를 출력하자.
#include <iostream>
#include <string>
using namespace std;

string input;
vector<int> seconds;
int sum;
int main() {
    while(input != "done"){
        cout << "Enter a number: ";
        cin >> input;

        if(input == "done") break;
        seconds.push_back(stoi(input));
    }

    cout << "Numbers: ";
    for(int a : seconds){
        cout << to_string(a) + " ";
    }
    cout << "\n";

    sort(seconds.begin(), seconds.end());

    for(int a : seconds){
        sum += a;
    }

    int average = sum / seconds.size();

    for(int a : seconds){
        int b = a - average;
        sum += b*b;
    }

    int sd = sqrt(sum / seconds.size());

    cout << "The average is " + to_string(average) + "\n";
    cout << "The minimum is " + to_string(seconds[0])+ "\n";
    cout << "The maximum is " + to_string(seconds[seconds.size()-1])+ "\n";
    cout << "The standard deviation is "+ to_string(average);
    
}

표준편차도 int형이라 정확하지 않음


예제 37. 암호 생성기

암호의 최소 길이, 특수문자 개수, 숫자 개수를 입력 받으면 이에 해당하는 암호를 생성한다.

 


예제 38. 필터링 값

숫자 리스트를 입력 받고 공백 글자로 나누어 저장한 다음 이 중에서 짝수만 들어있는 새로운 배열을 만들어 출력하는 프로그램을 작성하라.

Enter a list of numbers, seperated by spaces: 1 2 3 4 5 6 7 8
The even numbers are 2 4 6 8.

예제 39. 레코드 정렬


예제 40. 필터링 레코드


정리

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

// push_back, pop_back
// clear
// sort, reverse
// erase

vector<int> a;

void printVector(vector<int> v){
    cout << "{";
    for(int a : v){
        cout << to_string(a) + " ";
    }
    cout << "}\n";
}

int main() {

    a.push_back(1);
    a.push_back(2);
    a.push_back(3);
    a.push_back(4);
    a.push_back(5);
    // {1,2,3,4,5}
    printVector(a);

    a.pop_back();
    // {1,2,3,4}
    printVector(a);

    a.clear();
    //{}
    printVector(a);

    a.push_back(3);
    a.push_back(1);
    a.push_back(7);
    a.push_back(5);
    // {3,1,7,5}
    printVector(a);

    sort(a.begin(),a.end());
    // {1,3,5,7}
     printVector(a);

    sort(a.rbegin(), a.rend());
    // {7,5,3,1}
     printVector(a);

      reverse(a.begin(), a.end());
    // {1,3,5,7}
     printVector(a);

    a.erase(a.begin() + 2);
    // {1,3,7}
     printVector(a);
}

 

문자열 정렬보단 수 정렬이 코테 공부에 적합한듯하여 random이 나오는 것들은 좀 패스