문제
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() 함수 안에 지역 변수로 선언하면, 그 크기가 너무 커서 잘 동작하지 않을 수 있다.
크기가 큰 자료형은, 전역 변수로 선언하는 습관을 들이자.