복습 : 버블정렬
버블 정렬 알고리즘
int arr[5] = { 5,2,1,3,4 };
// 정렬 전 배열
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
printf("\n");
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
// 정렬 후 배열
for (int i = 0; i < 5; i++) {
printf("%d ", arr[i]);
}
C
복사
i | j | arr |
0 | 0 | 5 2 1 3 4 → 2 5 1 3 4 |
1 | 2 5 1 3 4 → 2 1 5 3 4 | |
2 | 2 1 5 3 4 → 2 1 3 5 4 | |
3 | 2 1 3 5 4 → 2 1 3 4 5 |
i | j | arr |
1 | 0 | 2 1 3 4 5 → 1 2 3 4 5 |
1 | 1 2 3 4 5 → 1 2 3 4 5 | |
2 | (이하 동일) | |
3 | (이하 동일) |
버블 정렬의 기본 형태
•
두번째 for문에서 N 이 아닌 N - 1 만큼 반복하는 이유
⇒ 현재 인덱스의 수와 다음 인덱스의 수를 비교하기 때문이다.
⇒ 만약, N 만큼 탐색한다면?
•
arr의 크기가 5일때, arr[4]와 arr[5]를 비교하게 됨 ⇒ 인덱스 접근 에러! (arr[5]는 존재하지 않는다.)
•
arr[5]는 arr[0] ~ arr[4] 이렇게 존재한다. (배열의 인덱스는 0부터 시작)
// 배열의 크기가 N인 경우
for (int i = 0; i < N; i++) { // 배열의 크기(N)만큼 탐색한다.
for (int j = 0; j < N - 1; j++) {
if (arr[j] > arr[j + 1]) { // 현재 인덱스의 수가 다음 인덱스의 수보다 크다면,
// 현재 인덱스의 수와 다음 인덱스의 수를 바꿔준다.
// 변수 swap 개념
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
}
}
}
C
복사
이론 : 2차원 배열
1차원 배열
int arr[5] = { 1, 2, 3, 4, 5 };
C
복사
2차원 배열
// 3행 5열의 2차원 배열을 선언하고 초기화한다.
int arr[3][5] = {
{ 1, 2, 3, 4, 5 },
{ 6, 7, 8, 9, 10 },
{ 11, 12, 13, 14, 15 }
};
C
복사
1열 | 2열 | 3열 | 4열 | 5열 | |
1행 | 1 | 2 | 3 | 4 | 5 |
2행 | 6 | 7 | 8 | 9 | 10 |
3행 | 11 | 12 | 13 | 14 | 15 |
1열 | 2열 | 3열 | 4열 | 5열 | |
1행 | arr[0][0] | arr[0][1] | arr[0][2] | arr[0][3] | arr[0][4] |
2행 | arr[1][0] | arr[1][1] | arr[1][2] | arr[1][3] | arr[4][4] |
3행 | arr[2][0] | arr[2][1] | arr[2][2] | arr[2][3] | arr[2][4] |
•
2차원 배열의 초기화 방법
int arr[3][5];
for (int i = 0; i < 3; i++) { // 0 ~ 2 (3행)
for (int j = 0; j < 5; j++) { // 0 ~ 4 (5행)
arr[i][j] = j;
printf("%d ", arr[i][j]);
}
printf("\n");
}
/*
< 출력 >
0 1 2 3 4
0 1 2 3 4
0 1 2 3 4
*/
C
복사
문제 : 배열
•
2021년 1학기 기말고사 F 평균값, 그리고 평균 이하 값과 초과 값은 몇 개씩? (1차원 배열 복습)
•
백준 2167 2차원 배열의 합 (2차원 배열 요소 접근)