Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

문타쿠, 공부하다.

[독하게 시작하는 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;
}