C++ 알고리즘 기초15 -배열을 만드는 방법1-

1. 배열

 

10개의 숫자가 공백으로 주어질때, 이들을 모두 기억하고 있어야한다면, 10개의 변수를 선언하고

 

cin으로 변수에 입력할 수 있지만,

 

int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;
cin >> a1;
cin >> a2;
...
cin >> a10;

 

100개, 1000개라면, 이들을 모두 선언하기에는 당연히 무리다.

 

배열은 여러 원소를 들고 있는 묶음으로 배열을 이용한다면 단 하나의 변수만으로 100개,1000개의 변수를 모두 관리할 수 있다.

 

선언하는 방법은 자바와 동일하다

 

int arr[3];

 

이는 arr이라는 이름의 배열이며, int 자료형인 원소를 3개 가지고 있는 배열을 생성하겠다는 의미이다.

 

배열 안에 있는 각 원소를 참조하기 위해 "원소의 번째 수 - 1"값을 대괄호 []안에 넣어주면 참조할 수 있다.

 

예를 들어 1번째 원소는 arr[0]으로 참조할 수 있다.

 

#include <iostream>
using namespace std;

int main() {

	int arr[3] = { 5, 6, 10 };
	cout << "First element is " << arr[0] << endl;
	cout << "Second element is " << arr[1] << endl;
	cout << "Third element is " << arr[2] << endl;

	return 0;

}

 

배열의 초기값 설정은 자바처럼 { } 안에 원소들을 순서대로 나열하면 된다

 

혹은 다음과 같이 참조하는 인덱스마다 값을 직접 넣어줄 수도 있다

 

#include <iostream>
using namespace std;

int main() {

	int arr[3];
	arr[0] = 5;
	arr[1] = 6;
	arr[2] = 10;

	cout << arr[0] << endl;
	cout << arr[1] << endl;
	cout << arr[2] << endl;

	return 0;

}

 

10개의 원소가 주어졌을때, 10개의 원소를 기억하면서도 그 합을 출력하고 싶다면,

 

#include <iostream>
using namespace std;

int main() {

    int arr[10];

    int answer = 0;

    for (int i = 0; i < 10; i++){
        cin >> arr[i];
        answer += arr[i];
    }

    cout << answer;

    return 0;
}

 

2. 거꾸로 출력하기

 

배열에 원소를 다 채우고, for문의 증감식을 감소시키는 방식으로 해서 인덱스 뒤에서부터 출력하면 될 것

 

다음은 10개의 문자를 입력받아 거꾸로 출력하는 코드

 

#include <iostream>
using namespace std;

int main() {
    
    char arr[10];

    for (int i = 0; i < 10; i++){
        cin >> arr[i];
    }

    for (int i = 9; i >= 0; i--){
        cout << arr[i];
    }
    return 0;
}
L E B R O S C O D E
EDOCSORBEL

 

3. 배열의 선언과 참조

 

크기가 10인 비어있는 정수형 자료를 담는 배열은 다음과 같이 만들 수 있고,

 

int a[10];

 

정수형 뿐만 아니라, 실수형 문자형의 배열도 double, char로 선언해서 다음과 같이 만들 수 있다.

 

double a[10];
char b[10];

 

크기 n의 배열을 선언하면, 각각의 원소는 0~n-1의 인덱스를 가지며 []안에 인덱스를 적어 독립된 변수처럼 접근할 수 있다.

 

i번째 원소는 i-1의 인덱스로 접근해야한다.

 

배열의 초기값 설정은 { }을 통해 가능하다.

 

int a[4] = {1,2,3,4};

 

위에서 4번째 원소 4를 5로 바꾸고 싶다면, 인덱스에 직접 접근해서 값을 새로 넣어주면 될거고

 

a[3] = 5;

 

a의 2번째 칸(1번 원소)에 정수를 입력받고 싶다면,

 

cin >> a[1];

 

a의 3번째 원소(2번 원소)를 출력하고 싶다면,

 

cout << a[2];

 

만약 크기가 n인 배열에서 n보다 더 적은 원소의 수로 초기화한다면, 인덱스 0부터 순서대로 채워넣는다.

 

그리고 자바처럼 초기값을 집어넣는데 정수형 배열의 경우 초기값은 0임

 

#include <iostream>
using namespace std;

int main() {

	int a[10] = { 1,2,3,4 };

	cout << a[2]<< endl;<< a[9];
	return 0;
}
3
0

 

모든 원소를 0으로 초기화하고 싶다면, { }으로 아무것도 안넣거나, 그냥 { }을 안써도 된다

 

int arr[5] = { };
int arr[6];

 

4. 연습문제

 

500이하의 정수가 총 10번 주어지는데, 250이상의 정수가 주어지면, 그 전까지 주어진 모든 정수들의 합계와 평균을 구하는 프로그램을 작성해보세요. 단, 250이상의 정수가 없다면 10개의 합계와 평균을 계산하면 됨에 유의합니다.

 

-------------------------------------------------------------------------------------------------------------

 

왜 이게 어려웠지??

 

일단 배열의 모든 합을 입력받으면서 미리 구하고

 

for문 순회해서, 250보다 적으면 더해가주고, 250이상이 되면 break로 빠져나간 다음에,

 

더해나간 누적합이 0이라면, 250이상의 정수가 주어지지 않은거니까 앞에서 구해놓은 전체 합을 10으로 나눈 평균을 구하고

 

누적합이 0이 아니라면, 250이상의 정수가 주어진거니까, 이들의 평균을 구하고

 

#include <iostream>
using namespace std;

int main() {
    
    int arr[10];
    int summation = 0;

    for (int i = 0; i < 10; i++){
        cin >> arr[i];
        summation += arr[i];
    }

    int answer = 0;
    int count = 0;

    int last = 0;

    for (int i =0; i< 10; i++){
        if(arr[i] < 250){
            answer += arr[i];
            count += 1;
            last = i;
        } else {
            break;
        }
    }

    if (answer == 0) {
        cout << summation;
        cout << fixed;
        cout.precision(1);
        cout << " " << (double)summation/10;    
    } else {
        cout << answer;
        cout << fixed;
        cout.precision(1);
        cout << " " << (double)answer/count;
    }
    return 0;
}

 

근데 관점을 바꾸면 이렇게 가능하더라고?

 

for문을 순회하는데, 250이상이면 break하고, 그렇지 않으면 answer에 계속 더해나간다면...

 

250 이상이 아니라면 계속 answer에 더해가줄테고, 250이상이 한번도 안나온다면 자연스럽게 배열의 모든 원소 합이 구해지는거고

 

250이상이 한번이라도 나온다면, 그 전까지 누적합이 answer에 저장되니까...

 

#include <iostream>
using namespace std;

int main() {
    
    int arr[10];

    for (int i = 0; i < 10; i++){
        cin >> arr[i];
    }

    int answer = 0;
    int count = 0;

    for (int i = 0; i < 10; i++){
        if (arr[i] >= 250){
            break;
        }
        answer += arr[i];
        count += 1;
    }

    cout << answer << " " ;
    cout << fixed;
    cout.precision(1);
    cout << (double)answer/count;
    return 0;
}

 

5. n개의 수를 입력받는 방법

 

정수 n이 입력으로 주어지고, n개의 실수형 수들을 입력받아 합을 구하고 싶은데

 

#include <iostream>
using namespace std;

int main() {

	int n;
	cin >> n;

	double val;
	double sum_val = 0;

	for (int i = 0; i < n; i++) {
		cin >> val;
		sum_val += val;
	}

	cout << sum_val;
	return 0;

}

 

배열에 값을 저장하고 싶다면, n보다 크거나 같은 크기의 배열이 필요하다.

 

단순히 선언한 배열 double arr[n];은 정적배열로 한번 선언하면 크기를 바꾸기가 매우 어렵다.

 

int n = 4;
double arr[n];

 

위와 같이 선언하면, arr[n]은 크기 4인 배열이며, 내가 입력으로 n이 5 이상을 입력한다면 arr[n]은 더 이상 쓸 수 없는 배열이 된다.

 

정적 배열을 사용해야한다면, 가능한 n의 최대 크기를 확인한 다음, 모두 담을만한 충분한 크기의 배열을 선언해야한다.

 

만약 n의 제한이 100 이하라면...

 

크기가 100인 배열을 선언해줘야한다.

 

#include <iostream>
using namespace std;

int main() {

	int n;
	cin >> n;

	double arr[100];
	double sum_val = 0;

	for (int i = 0; i < n; i++) {
		cin >> arr[i];
		sum_val += arr[i];
	}

	cout << sum_val;
	return 0;

}

 

근데... 그냥 n을 입력받은 다음에 입력받은 n 크기의 배열을 선언해도 되는거 아녀?

 

그래도 되잖아??

 

#include <iostream>
using namespace std;

int main() {
    
    int n;
    cin >> n;

    double arr[n];
    double answer = 0.0;

    for (int i = 0; i < n; i++){
        cin >> arr[i];
        answer += arr[i];
    }

    answer /= n;

    cout << fixed;
    cout.precision(1);
    cout << answer << endl;

    if (answer >= 4.0){
        cout << "Perfect";
    } else if (answer >= 3.0){
        cout << "Good";
    } else {
        cout << "Poor";
    }

    return 0;
}
4
3.0 2.8 4.0 3.5
3.3
Good

 

6. 연습문제

 

n개의 원소가 차례대로 주어졌을 때, 짝수인 수만 출력하려고 합니다. 이 때, 출력의 순서를 입력의 순서와 반대로 하는 프로그램을 작성해보세요.

예를 들어, 입력된 숫자들이 1 2 3 4 5 6 이라면 출력이 6 4 2 가 되도록 합니다.

 

-------------------------------------------------------------------------------------------------------------------------------

 

어렵게 생각할 것 전혀 없이, 일단 크기 n인 배열을 채우고, 거꾸로 순회해서 짝수이면 출력하고 아니면 넘기고

 

그러면 입력의 순서와 반대로 짝수인 수를 출력할 것이다.

 

#include <iostream>
using namespace std;

int main() {
    
    int n;
    cin >> n;

    int arr[n];

    for (int i = 0; i < n; i++){
        cin >> arr[i];
    }

    for (int i = n-1; i >= 0; i--){
        if (arr[i] % 2 == 0){
            cout << arr[i] << " ";
        }
    }
    return 0;
}
TAGS.

Comments