페이지가 로드되지 않나요? 여기를 눌러보면 고쳐질 수도 있어요.
Placeholder

#8586

Tutorial : STL Array 2s 1024MB

문제

STL Pair 자료형을 익혔으니, 이제 STL Array 자료형도 익혀보자.

#include <array> 헤더 안에 있다. using namespace std; 도 필요하다.

알다시피 array 는 "배열"이라는 뜻이다. 1차원 배열과 비슷한 개념이다.

#include <array>
using namespace std;

array <int, 3> a;

위처럼 선언하면 된다.

선언 형식은 array <자료형, 개수> 이름; 이다.

a 는, 정수(int)를 3개 담을 수 있는 자료형인 셈이다.

배열과 똑같이, 차례대로 a[0], a[1], a[2] 가 될 것이다.

이 외의 기본 선언법들은 아래 그림과 같다.


여기서 알 수 있는 것은, 1차원 배열과 거의 똑같은 개념이라는 것이다.

array <int, 5> a;
int b[5];
a[0]=1;
a[1]=2;

int 를 5개 저장하는 array a 랑,

5칸의 정수 배열 b 는 거의 유사하다.

한 가지 주의할 점은, array 의 크기는 변수가 될 수 없다는 것이다.

int n = 5;
array <int, n> a;

위 코드는 컴파일 에러가 난다.

n = 5 라고 해서 5 칸의 array 가 만들어지는 것이 아니다.

반드시 array 의 크기는 "상수"가 되어야 한다.


그럼, array 는 언제 유용할까? 주로 2차원 이상에서 유리하다. ( 여러 array 들을 정렬할 때 )

5개의 정수 a, b, c, d, e 로 구성된 구조체 100개가 있다고 생각해보자.

이 100개의 구조체들을,

1순위 : a 값,ㅤ2순위 : b 값,ㅤ3순위 : c 값,ㅤ4순위 : d 값,ㅤ5순위 : e 값으로 오름차순 정렬하려면 어떻게 할까?

앞서 배운 대로, 아래처럼 구조체를 만들고 내부에 operator 를 구현해도 되긴 한다. ( 또는 외부에 comp 함수 )

struct Data{
    int a, b, c, d, e;
    bool operator < ( const Data &Right ) const{
        // 여기에 1순위:a, 2순위:b, 3순위:c, 4순위:d, 5순위:e 
        // ....
    }
};

하지만, 변수가 5개나 되기에, if 문을 너무 많이 쓰고 코드가 복잡해질 것이다.


이럴 때, array 를 사용한다면? 매우 간단하다.

위에서 5개의 정수를 담는 Data 구조체를, 5개의 정수를 담는 array 라고 해석하면 아래와 같다.

array <int, 5> Data;

이러한 구조체(Data) 가 100 개 있다고 했으니, 아래처럼 2차원 array 가 만들어진다.

array <int, 5> Data[100];

Data 는 array <int, 5> 를 100개 담는다.

아래의 sort 코드는 잘 작동한다.

sort(Data, Data + 100);

왜일까? 왜 별다른 operator 나 comp 함수가 없는데도 잘 정렬이 될까?

array 는, 애초에 비교 연산자가 내부에 구현이 되어 있기 때문이다.

비교 기준은 맨 왼쪽 칸부터 1순위, 2순위, 3순위, ... 로 설정되어 있다.

문자열로 따지면 "사전순 비교"와 비슷하다.

맨 앞 글자부터 비교하고, 같다면 다음 글자, 같다면 그 다음 글자... 로 비교하는 것이다.


Array 는 Pair 의 일종의 상위 호환 느낌이다.

pair<int, int> 와 array <int, 2> 는 거의 비슷하기 때문이다.

pair 는 2개의 변수만 가질 수 있지만, array 는 3개 이상도 가능하다.

하지만 array 는, 구성 원소의 자료형이 모두 똑같아야 한다.

pair는, pair <string, int> 처럼 양쪽의 자료형이 다른 경우도 가능하지만,

이 경우 array 는 사용할 수 없다.

문제 상황에 맞게 적절한 자료형을 고르면 될 것이다.


<응용 문제>

5개의 정수 a, b, c, d, e 로 구성된 구조체가 있다.

이 구조체를 N 개 입력 받아 아래와 같은 정렬 기준으로 정렬하여 출력하자.

1순위 : a 값 오름차순

2순위 : b 값 내림차순

3순위 : c 값 오름차순

4순위 : d 값 내림차순

5순위 : e 값 오름차순

b , d 는 내림차순이어야 함에 주의하자.


입력

첫 줄에 N 이 입력된다. ( 1 ≤ N ≤ 100,000 )

이후 N 줄에 걸쳐 a, b, c, d, e 값이 입력된다. ( 모두 0 이상 109 이하 )


출력

각 구조체를 정렬한 결과를 N 줄에 걸쳐 출력하자.


예제

5
1 2 3 4 5
3 5 4 3 2
1 1 3 4 5
1 4 3 2 5
3 5 4 1 2
1 4 3 2 5
1 2 3 4 5
1 1 3 4 5
3 5 4 3 2
3 5 4 1 2

array <int, 5> a[100005]; 로 선언하고 짜면 편할 것이다.

이를 main() 함수 안에 지역 변수로 선언하면, 그 크기가 너무 커서 잘 동작하지 않을 수 있다.

크기가 큰 자료형은, 전역 변수로 선언하는 습관을 들이자.




출처

againalgo

로그인해야 코드를 작성할 수 있어요.