이 Step에서 다루는 것

  • 배열을 함수로 전달할 때 “포인터로 받는 이유”를 체감하기
  • 중복 없는 난수 뽑기(1~45에서 6개) + 정렬 + 출력까지 한 사이클 완성
  • 버블 정렬의 동작 원리(정렬이 “점점 확정되는 영역”)

학습 목표

  • ChooseLotto(int* numbers)가 실제로는 “배열의 시작 주소”를 받는다는 것을 설명할 수 있다.
  • 중복 검사가 왜 0 ~ count-1까지만 보면 되는지 설명할 수 있다.
  • count - 1 - i가 무엇을 의미하는지 말로 설명할 수 있다.

Swap (참조로 값 교환)

void Swap(int& a, int& b) {
    int temp = a;
    a = b;
    b = temp;
}

핵심:

  • 참조(int&)를 쓰면 “원본”을 직접 바꿀 수 있습니다.

Sort (버블 정렬)

void Sort(int* numbers, int count) {
    if (numbers == nullptr || count <= 1)
        return;

    for (int i = 0; i < count - 1; i++) {
        for (int j = 0; j < count - 1 - i; j++) {
            if (numbers[j] > numbers[j + 1]) {
                Swap(numbers[j], numbers[j + 1]);
            }
        }
    }
}
  • count - 1 - i의 의미:
    • 버블 정렬은 한 바퀴 돌면(외부 루프 1회) 가장 큰 값이 “뒤로 밀려” 확정됩니다.
    • 그래서 i가 증가할수록 뒤쪽은 이미 정렬된 영역이므로, 비교 범위를 줄여도 됩니다.

복잡도 감각:

  • 시간 복잡도: (O(n^2)) (n이 커지면 느림)
  • 지금은 n=6이라서 학습용으로 충분합니다.

ChooseLotto

void ChooseLotto(int* numbers) {
    if (numbers == nullptr)
        return;

    int count = 0;

    while (count != 6) {
        int randValue = 1 + rand() % 45;

        int i;
        for (i = 0; i < count; i++) {
            if (numbers[i] == randValue) break;  // 중복 확인
        }

        if (i == count) {  // 중복이 아닌 경우에만 저장
            numbers[count] = randValue;
            count++;
        }
    }

    Sort(numbers, 6);
}

핵심 아이디어:

  • count는 “현재까지 채운 개수”입니다.
  • 중복 검사는 이미 채워진 구간(0 ~ count-1) 만 보면 됩니다.
  • 중복이 아니면 numbers[count]에 넣고 count++.

자주 하는 실수:

  • for (i = 0; i < 6; i++)로 돌려서 아직 채우지 않은 쓰레기 값까지 비교해버리기
    → 비교 범위는 반드시 i < count여야 합니다.

void Print(int* numbers, int count) {
    if (numbers == nullptr || count <= 0)
        return;

    for (int i = 0; i < count; i++) {
        std::cout << numbers[i] << ' ';
    }
    std::cout << '\n';
}

main 흐름

int main() {
    srand((unsigned)time(0));

    int lotto[6] = {};
    ChooseLotto(lotto);
    Print(lotto, 6);

    return 0;
}

실행 결과 예시: 7 12 18 24 36 42 (중복 없음, 오름차순)

체크 질문 (스스로 답해보기)

  • ChooseLotto(lotto)에서 lotto는 값이 전달될까, 주소가 전달될까?
  • ChooseLotto의 중복 검사에서 왜 i < count까지만 보면 되는가?
  • 버블 정렬에서 count - 1 - i가 “확정된 영역”을 의미하는 이유는?

profile
李家네_공부방

0개의 댓글