과제는 로또 번호 생성기 코드다.
1부터 45 사이의 번호 중 중복 없이 6개를 뽑고,
선택 정렬로 오름차순 정렬한 뒤 5회 출력하는 구조다.
1. 제출 코드 구성
| 파일 | 역할 |
|---|---|
prg_lotto_main.c |
프로그램 시작점, 전체 반복 흐름 담당 |
lib_lotto_logic.h |
함수 원형 선언 |
lib_lotto_logic.c |
로또 번호 생성, 중복 검사, 정렬, 출력 구현 |
이 과제에서 가장 좋은 부분은 기능을 main에 몰아넣지 않고, 번호 생성/중복 검사/정렬/출력을 함수로 분리했다는 점이다.
2. 전체 실행 흐름
난수 시드 설정
로또 번호 배열 준비
5회 반복
중복 없는 번호 6개 생성
오름차순 정렬
결과 출력
프로그램 종료
main()은 세부 계산을 직접 하지 않고, 필요한 함수를 순서대로 호출한다.
int main(void)
{
int iLottoArr[ARR_SIZE] = {0};
int iLoop;
srand(time(0));
for (iLoop = 0; iLoop < LOTTO_REPEAT_COUNT; iLoop++)
{
getLottoNo(iLottoArr);
sortArrAsc(iLottoArr);
prnArr(iLottoArr, iLoop);
}
return 0;
}
3. 핵심 함수 1: 중복 없는 번호 생성

getLottoNo()는 배열의 각 위치에 번호를 채운다. 새 번호가 이미 앞쪽 배열에 있으면 다시 뽑고, 중복이 아니면 저장한다.
void getLottoNo(int iLottoArr[])
{
int iIndex;
int iRandNo;
for (iIndex = 0; iIndex < ARR_SIZE; iIndex++)
{
while (TRUE)
{
iRandNo = (rand() % MAX_LOTTO_NO) + 1;
if (isDuplicateNo(iLottoArr, iIndex, iRandNo) == TRUE)
{
continue;
}
iLottoArr[iIndex] = iRandNo;
break;
}
}
}
여기서 iIndex 이전까지만 검사하는 이유가 중요하다. 아직 채우지 않은 뒤쪽 칸은 검사할 필요가 없다.
4. 핵심 함수 2: 중복 검사
int isDuplicateNo(const int iLottoArr[], int iIndex, int iRandNo)
{
int iCheckIndex;
int iIsDuplicate;
iIsDuplicate = FALSE;
for (iCheckIndex = 0; iCheckIndex < iIndex; iCheckIndex++)
{
if (iRandNo == iLottoArr[iCheckIndex])
{
iIsDuplicate = TRUE;
break;
}
}
return iIsDuplicate;
}
중복 검사를 함수로 분리하면 번호 생성 함수가 훨씬 읽기 쉬워진다. const int iLottoArr[]를 쓴 것도 좋다. 이 함수 안에서는 배열을 읽기만 하고 바꾸지 않는다는 의미가 드러난다.
5. 핵심 함수 3: 선택 정렬
선택 정렬은 아직 정렬되지 않은 구간에서 최솟값을 찾아 앞쪽으로 보내는 방식이다.
| 단계 | 설명 |
|---|---|
| 기준 위치 선택 | iLoop 위치를 현재 정렬할 자리로 둔다. |
| 최솟값 탐색 | 뒤쪽 구간에서 가장 작은 값을 찾는다. |
| 교환 | 최솟값 위치와 기준 위치를 바꾼다. |
코드에서는 iMin, iMinIndex, iSearchIndex, iTemp가 역할별로 나누어져 있어 손으로 따라가기 쉽다.
6. 리뷰 포인트
좋았던 점:
- 기능별 함수 분리가 잘 되어 있다.
- 중복 검사와 정렬 로직이 분리되어 재사용 가능하다.
- 변수명이
iRandNo,iCheckIndex,iMinIndex처럼 역할을 설명한다. - 헤더 파일로 선언부를 분리했다.
보완하면 좋은 점:
for문의 증가식은++iLoop보다 수업 스타일에 맞춰iLoop++로 통일하면 더 익숙하다.prnArr()에서 마지막 인덱스일 때break를 쓰기보다 출력 구분자를 조건으로 나누면 흐름이 더 자연스럽다.TRUE,FALSE는 C에서 직접 정의해도 되지만, 과목 스타일에 따라1,0의 의미를 주석으로 명확히 두면 좋다.
7. 정리
이 과제는 배열, 반복문, 함수 분리, 중복 검사, 선택 정렬이 한 번에 들어간 좋은 종합 예제다.
핵심은 난수 생성 자체보다 중복을 어떻게 막고, 정렬을 어떤 단계로 수행하는지를 설명할 수 있는 것이다.
'language > c' 카테고리의 다른 글
| [C언어] 기말고사 Review - 학생 성적 구조체 (0) | 2026.09.21 |
|---|---|
| [C언어] 중간고사 Review - 사칙연산 계산기 (0) | 2026.09.14 |
| [C언어] 10. 구조체와 동적할당 (0) | 2026.09.07 |
| [C언어] 09. 포인터 (Pointer) (0) | 2026.08.31 |
| [C언어] 08. 문자열 (String) (0) | 2026.08.24 |