본문 바로가기
Unreal/C++

[C++ 01.17] 배열과 오름차순, 선택 정렬 sort() 함수,

by 우타미 2025. 1. 17.
반응형

필자는 지금 벡터공부를 하려고 하다가 벡터한테 져서 다시 배열로 돌아온 상태이다.
많은 사건들이 있었다. 난 분명 벡터 써서 잘 돌아간다~~ 이러고 있었는데
벡터를 써라는 이유가 push_back 써서 입력하라는 소리입니다.라고 쌤이 말씀하시길

무슨 소린진 모르겠고 배운 것 같기도 하고 하지만 내 뇌에선 아무리 찾아봐도 관련 자료 따위 나오지 않았지

내 심정 - 필자의 콘티 중 일부 발췌



1. 배열

숫자를 처리할 때 지금까지 int 또는 double 등 을 사용해 선언했었다. 같은 형태의 많은 데이터를 반복문으로 처리하기 위해 우리는 메모리에 하나씩이 아닌 줄줄이 저장해 놓고 사용하기로 한 것이 배열이다.

선언방법은 이렇다.

자료형 배열명[요소개수]

int arr[8];

바로 예시코드를 확인해 보자

#include <iostream>
using namespace std;

int main(void)
{
	int arr[4];
	arr[0] = 1; // 첫번째 배열에 1
	arr[1] = 2; // 두번째 배열 2
	cin >> arr[2]; // 3번째 배열 cin으로 입력받기

	cout << arr[0] << endl << arr[1] << endl << arr[2] << endl << arr[3];// 전부 출력
	return 0;
}

cin으로 80을 3번째 배열요소에 입력하고 모든 배열을 출력한 값이다.

4번째 배열 요소는 지정해 둔 값이 없어서 쓰레기값이 뜬다.

int가 4개 줄줄이 소세지 처럼 생기기 때문에 총 (inr 4바이트) * 4 = 16바이트가 할당된다. 
그렇기에 우리는 배열을 선언할 때에는 메모리를 생각해서 적절하게 선언해야 한다는 것을 알 수 있다.

 

그리고

첫 번째 배열이라고 arr[1] 이라고 생각할 수 있는데 첫 번째는 [0]부터 시작한다는 것 기억해 두시길!!

 

1. 배열의 초기화 방법

 

배열도 최초 할당될 때에는 쓰레기 값이 저장되어 있다. 위의 예시처럼 -8589934460 이렇게 뜨는 것을 확인해 볼 수 있다.

그럼 어떻게 초기화를 해야 하는가?

 

가장 기본적인 방법은 중괄호 사이에 [0] 번부터 [4]까지 차례대로 1, 2, 3, 4, 5를 넣는 방법이다.

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

만약 배열의 크기보다 초기화하는 요소의 개수가 적다면 남은 배열은 모두 0으로 처리된다

int main(void)
{
	int arr[4] = { 1,2 }; // 배열크기보다 작은 배열요소 초기화
	cout << arr[0] << endl << arr[1] << endl << arr[2] << endl << arr[3];
    return 0;
}

출력된 값을 보면 알아서 0으로 처리된 것을 확인할 수 있다.

int arr[1000] ={0};

많은 배열을 자동적으로 0으로 초기화할 수 있다. 

	int arr[2] = {1, 2};
	int arr[] = {1, 2};

윗줄의 코드와 아래의 코드는 같다. 컴파일러는 초깃값 개수만큼 배열요소 개수를 저장공간에 할당한다. 

여기까지 이해했다면 반복문과 함께 배열을 사용해 보자

2. 배열과 반복문

백준 10807 문제를 풀어보자 아래 링크 클릭하면 문제 홈페이지로 이동 

https://www.acmicpc.net/problem/10807

#include <iostream>
using namespace std;

int main(void)
{
	int n;
	int ary[101];
	int v;
	int result = 0;
	cin >> n;

	for (int i = 0; i < n;i++) //n개만큼 배열입력 받기
	{
		cin >> ary[i];
	}
	cin >> v;
	for (int i = 0; i < n; i++) // 배열크기만큼 for문 돌리기
	{
		if (v == ary[i]) //v와 배열요소의 값이 같다면
		{
			result += 1; // 카운트 수 증가
		}
	}

	cout << result;

	return 0;
}

필자는  n개의 개수만큼 1씩 증가시키며 배열을 입력받고 배열크기만큼 반복문을 돌리며 조건문을 통해 카운트했다.

이 정도 할 줄 알면 배열 나 좀 친다고 말해도 되는 걸까?라고 생각하는 순간 다다음문제에서 막힘

2. 선택 정렬

배열 문제를 풀다 보면 배열을 크기 순으로 정렬을 해라고 하는 문제가 나온다. 그렇다면 어떻게 할 것인가? 지금 우리 가 아는 지식으로는 for 문을 돌려가며 하나하나 숫자의 크기를 비교해서 순서대로 줄 세우는 방법뿐이라는 것 을 알 수 있다.

사실 여기서부터 알고리즘 공부를 하는 게 맞는 것 같기도?

출처 위키백과

for문을 통해 수를 비교하며 최솟값을 찾아 맨 앞의 위치의 수와 교환을 한다. 

최솟값이라 인식된 수를 위치변환을 제외하고 나머지 수들만 다시 비교하는 방법을 반복한다. 

#include <iostream>
using namespace std;

int main(void)
{
	int i, j, min, index, temp;

	int arr[5] = { 4,2,3,5,1 }; // 배열 초기화
	for (i = 0; i < 5; i++)// 배열의 수만큼 자리 교환 반복
	{
		min = 9999; //for문 돌릴때 마다 초기화
		for (j = i; j < 5; j++) 
		{
			if (min > arr[j])  // 최소값 확인
			{
				min = arr[j];
				index = j; 
			}
		}
		temp = arr[i]; //자리 교환함
		arr[i] = arr[index];
		arr[index] = temp;
	}
	for (i = 0; i < 5; i++) // 오름차순 정렬 출력
	{
		cout << arr[i] << " ";
	}
	return 0;
}

 

출력 결과는 이렇게 나온다.

3. sort() 함수

그렇다. 필자는 빡대가리라 그런지 선택정렬을 이해하는데 너무 오래 걸렸고 이해했으니 나는 쉬운 길을 걷기로 택했다.
그것은 바로 sort() 함수 

#include <iostream>
#include <algorithm> // sort()함수를 사용하기 위한 헤더
using namespace std;

int main(void)
{
	
	int arr[5] = { 4,2,3,5,1 };
	sort(arr, arr + 5);


	for (int i = 0; i < 5; i++)
	{
		cout << arr[i] << " ";
	}
	return 0;
}

확실히 위의 선택정렬 코드보다는 간결해졌다. 출력결과를 확인해 보자.

출력값도 오름차순으로 잘 정렬된 것을 확인할 수 있다.
sort() 함수의 사용법은 다음과 같다.

1. <argorithm> 헤더를 include 한다.

2. sort(배열의 시작 주소 배열의 마지막 주소+1) ;

 

그렇다 나는 이제 오름차순을 쉽게 할 수 있는 사람이 된 것이다. 

 

여기까지 이해했다면 배열과 sort() 함수를 이용해 문제를 풀어보자!

https://www.acmicpc.net/problem/10818

위의 링크는 백준 10818번 문제 링크이다.

#include <iostream>
#include <algorithm> //sort 함수 쓰기위해

using namespace std;

int main(void) 
{
	int array[1000001]; 
	int n;
	cin >> n;

	for (int i = 0; i < n; i++) //배열 수 만큼 값 입력받아 초기화하기
    {
		cin >> array[i];
	}

	sort(array, array + n); // 입력받은 배열 sort()함수 써서 오름차순 정리

	cout << array[0] << " " << array[n - 1]; // 첫번째 수 (최솟값) 마지막수 (최댓값) 출력

	return 0;
}

 

필자가  푼 방법 

 

여러분도 코딩짱이 되길 기원하며 배열을 끝내도록 하겠숩니다. 아디오스

 

반응형