문타쿠, 공부하다.
[독하게 시작하는 C 프로그래밍] 섹션 13. 배열과 프로그래밍 기법 (Part 3. C언어 수준향상) 본문
C언어/독하게 시작하는 C 프로그래밍
[독하게 시작하는 C 프로그래밍] 섹션 13. 배열과 프로그래밍 기법 (Part 3. C언어 수준향상)
개발새발 문타쿠 2023. 11. 9. 01:07배열의 기본 문법
배열
- 형식이 같은 자료 여러 개를 모아 한 덩어리로 관리하는 문법
- 여러 요소를 식별하기 위해 인덱스를 사용하며 0부터 시작
- 배열의 이름은 0번 요소의 메모리 주소에 대한 식별자이며 상수
문자 배열 (문자열)
- 문자열의 실체는 char[ ]
- 문자열 상수란 쓰기가 허용되지 않는 이름이 없는 char[ ]
- 문자열의 끝은 반드시 \0(NULL)
- 문자열 상수는 보통 포인터를 사용해 관리
[필수 실습 문제] 배열에서 최댓값 찾기
#include <stdio.h>
int main(void)
{
int aList[5] = { 0, };
int max = 0;
printf("aList: %d, %d, %d, %d, %d\n\n", \
aList[0], aList[1], aList[2], aList[3], aList[4]);
printf("5개의 숫자를 입력해주세요.\n");
for (int i = 0; i < 5; i++)
{
printf(">> ");
scanf_s("%d", &aList[i]);
if (aList[i] > max)
max = aList[i];
}
printf("\naList: %d, %d, %d, %d, %d\n", \
aList[0], aList[1], aList[2], aList[3], aList[4]);
printf("MAX: %d\n", max);
return 0;
}
#include <stdio.h>
int main(void)
{
int aList[5] = { 0, };
int max = 0;
printf("aList: %d, %d, %d, %d, %d\n\n", \
aList[0], aList[1], aList[2], aList[3], aList[4]);
printf("5개의 숫자를 입력해주세요.\n");
for (int i = 0; i < 5; i++)
{
printf(">> ");
scanf_s("%d", &aList[i]);
}
printf("\naList: %d, %d, %d, %d, %d\n", \
aList[0], aList[1], aList[2], aList[3], aList[4]);
// max 값을 0이 아닌 aList[0]의 값으로 부여해서 aList[1]부터 비교
max = aList[0];
for (int i = 1; i < 5; i++)
{
if (aList[i] > max)
max = aList[i];
}
printf("MAX: %d\n", max);
return 0;
}
[필수 실습 문제] 배열에서 최솟값 찾기
#include <stdio.h>
int main(void)
{
int aList[5] = { 0, };
printf("5개의 숫자를 입력해주세요.\n");
for (int i = 0; i < 5; i++)
{
printf(">> ");
scanf_s("%d", &aList[i]);
}
printf("\naList: %d, %d, %d, %d, %d\n", \
aList[0], aList[1], aList[2], aList[3], aList[4]);
for (int i = 1; i < 5; i++)
{
if (aList[0] > aList[i])
{
int tmp = aList[i];
aList[i] = aList[0];
aList[0] = tmp;
}
}
printf("MIN: %d\n", aList[0]);
return 0;
}
[필수 실습 문제] 버블정렬
#include <stdio.h>
int main(void)
{
int bubbleSort[5] = { 0, };
printf("5개의 숫자를 입력해주세요.\n");
for (int i = 0; i < 5; i++)
{
printf(">> ");
scanf_s("%d", &bubbleSort[i]);
}
printf("\n>> Bubble Sort <<\n");
printf("Before\t: %d\t%d\t%d\t%d\t%d\n", \
bubbleSort[0], bubbleSort[1], bubbleSort[2], bubbleSort[3], bubbleSort[4]);
for (int i = 0; i < 5; i++)
{
// if문 안쓰고 i의 범위를 5 말고 4로 바꿔도 된다우
if (i == 4)
break;
for (int j = i + 1; j < 5; j++)
{
if (bubbleSort[i] > bubbleSort[j])
{
int tmp = bubbleSort[i];
bubbleSort[i] = bubbleSort[j];
bubbleSort[j] = tmp;
}
}
printf("%d트\t: %d\t%d\t%d\t%d\t%d\n", \
i + 1, bubbleSort[0], bubbleSort[1], bubbleSort[2], bubbleSort[3], bubbleSort[4]);
}
printf("after\t: %d\t%d\t%d\t%d\t%d\n", \
bubbleSort[0], bubbleSort[1], bubbleSort[2], bubbleSort[3], bubbleSort[4]);
return 0;
}
[필수 실습 문제] 선택정렬
#include <stdio.h>
int main(void)
{
int selectionSort[5] = { 0, };
printf("5개의 숫자를 입력해주세요.\n");
for (int i = 0; i < 5; i++)
{
printf(">> ");
scanf_s("%d", &selectionSort[i]);
}
printf("\n>> Selection Sort <<\n");
printf("Before\t: %d\t%d\t%d\t%d\t%d\n", \
selectionSort[0], selectionSort[1], selectionSort[2], selectionSort[3], selectionSort[4]);
// 중요 포인트) 버블정렬과 다르게 선택정렬에서 교환은 한 번만 이루어짐!
for (int i = 0; i < 4; i++)
{
int idxMin = i;
for (int j = i + 1; j < 5; j++)
{
if (selectionSort[idxMin] > selectionSort[j])
idxMin = j;
}
if (idxMin != i)
{
int temp = selectionSort[i];
selectionSort[i] = selectionSort[idxMin];
selectionSort[idxMin] = temp;
}
printf("%d트\t: %d\t%d\t%d\t%d\t%d\n", \
i + 1, selectionSort[0], selectionSort[1], selectionSort[2], selectionSort[3], selectionSort[4]);
}
printf("after\t: %d\t%d\t%d\t%d\t%d\n", \
selectionSort[0], selectionSort[1], selectionSort[2], selectionSort[3], selectionSort[4]);
return 0;
}
다차원 배열
- 배열의 요소가 배열인 배열
- 2차원 구조일 경우 [행][열]
- 3차원 구조일 경우 [면][행][열] -> 딱히 사용할 일이 음슴
[필수 실습 문제] 행과 열의 총 합 출력
#include <stdio.h>
int main(void)
{
int aList[3][4] = {
{10, 20, 30},
{40, 50, 60} };
// 행 합계
for (int i = 0; i < 3; i++)
{
int rowSum = 0;
for (int j = 0; j < 4; j++)
rowSum += aList[i][j];
aList[i][3] = rowSum;
}
// 열 합계
// 대각선(?) 값인 210을 뺄려면 i의 범위를 4가 아닌 3보다 작다로 수정
for (int i = 0; i < 4; i++)
{
int colSum = 0;
for (int j = 0; j < 2; j++)
colSum += aList[j][i];
aList[2][i] = colSum;
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d ", aList[i][j]);
}
printf("\n");
}
return 0;
}
[필수 실습 문제] for문을 사용해 배열에 값 저장하기
#include <stdio.h>
int main(void)
{
int aList[5][5] = { 0, };
int value = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
aList[i][j] = ++value;
printf("%d\t", aList[i][j]);
}
printf("\n");
}
return 0;
}
[필수 실습 문제] for문을 사용해 배열에 값 교차 저장하기
#include <stdio.h>
int main(void)
{
int aList[5][5] = { 0, };
int value = 0;
for (int i = 0; i < 5; i++)
{
if (i % 2 == 0)
{
for (int j = 0; j < 5; j++)
aList[i][j] = ++value;
}
else
{
for (int j = 4; j >= 0; j--)
aList[i][j] = ++value;
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d\t", aList[i][j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(void)
{
int aList[5][5] = { 0, };
int value = 0;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (i % 2 == 0)
aList[i][j] = ++value;
else
aList[i][4 - j] = ++value;
}
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d\t", aList[i][j]);
}
printf("\n");
}
return 0;
}
#include <stdio.h>
int main(void)
{
int aList[5][5] = { 0, };
int value = 0;
int flag = 1;
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
if (flag)
aList[i][j] = ++value;
else
aList[i][4 - j] = ++value;
}
flag = !flag;
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d\t", aList[i][j]);
}
printf("\n");
}
return 0;
}
[필수 실습 문제] 달팽이/소용돌이/나선형 배열
#include <stdio.h>
int main(void)
{
int snailSort[5][5] = { 0, };
int value = 1;
int rowStart = 0, rowEnd = 4, colStart = 0, colEnd = 4;
while (value <= 25)
{
// 1. 오른쪽으로 이동
for (int col = colStart; col <= colEnd; col++)
{
snailSort[rowStart][col] = value++;
}
rowStart++;
// 2. 아래로 이동
for (int row = rowStart; row <= rowEnd; row++)
{
snailSort[row][colEnd] = value++;
}
colEnd--;
// 3. 왼쪽으로 이동
for (int col = colEnd; col >= colStart; col--)
{
snailSort[rowEnd][col] = value++;
}
rowEnd--;
// 4. 위로 이동
for (int row = rowEnd; row >= rowStart; row--)
{
snailSort[row][colStart] = value++;
}
colStart++;
}
for (int i = 0; i < 5; i++)
{
for (int j = 0; j < 5; j++)
{
printf("%d\t", snailSort[i][j]);
}
printf("\n");
}
return 0;
}
고급 기법 Lookup 배열
- 데이터를 검색 혹은 참조하기 위해 사용하는 배열
- 보통 기준에 따라 인덱스 값을 계산하고 식별한 요소를 활용하는 구조
- 배열의 한 요소가 처리할 하나의 경우로 활용
- 고성능에 매우 탁월
#include <stdio.h>
int main(void)
{
int age = 0, charge = 1000;
double aRate[10] = {
// 1~3세: 100% 할인
0.0, 0.0, 0.0,
// 4~5세: 70% 할인
0.3, 0.3,
// 6~7세: 50% 할인
0.5, 0.5,
// 8세: 30% 할인, 9세: 20% 할인, 10세: 10% 할인
0.7, 0.8, 0.9
};
printf(">> 요금표 <<\n");
for (int i = 1; i <= 10; i++)
{
printf("%d세 요금: %d원\n", i, (int)(charge * aRate[i - 1]));
}
printf("\n");
printf("몇 짤? ");
scanf_s("%d", &age);
// 유저를 믿지 말라
// 나이가 1~10세의 범위를 벗어났을 때 강제 조정
if (age < 1)
age = 1;
else if (age > 10)
age = 10;
printf("%d세의 요금은 %.0f%% 할인되어 %d원입니다.\n", \
age, (1 - aRate[age - 1]) * 100, (int)(charge * aRate[age - 1]));
return 0;
}
'C언어 > 독하게 시작하는 C 프로그래밍' 카테고리의 다른 글
[독하게 시작하는 C 프로그래밍] 섹션 15. 메모리와 포인터 (0) | 2023.11.19 |
---|---|
[독하게 시작하는 C 프로그래밍] 섹션 14. 함수에 대한 기본 이론 (0) | 2023.11.12 |
[독하게 시작하는 C 프로그래밍] 섹션 12. 반복문 (0) | 2023.11.02 |
[독하게 시작하는 C 프로그래밍] 섹션 11. 기본 제어문 (0) | 2023.11.01 |
[독하게 시작하는 C 프로그래밍] 섹션 10. 연산자 (0) | 2023.10.29 |