[C++/Algorithm] for문, while문

정건희·2024년 12월 10일

STL/알고리즘

목록 보기
9/10

1. for문의 사용 형태

C++에서 for 문은 크게 세 가지 형태로 사용할 수 있습니다. 각 형태와 용도에 대해 설명드리겠습니다.


1. 기본 for문

for (int i = 0; i < 10; i++) {
    // 반복문 내용
}
  • 가장 오래된 형태이며, 초기값, 조건, 증감을 명시적으로 제어
  • 배열, 숫자 범위 등을 순회할 때 주로 사용한다.

예시

int arr[] = {1, 2, 3, 4, 5};
for (int i = 0; i < 5; i++) {
    cout << arr[i] << " "; // 출력: 1 2 3 4 5
}

2. 범위 기반 for문 (Range-based for loop) [C++11 이상]

for (char c : str) {
    // str 문자열의 각 문자를 c로 순회
}
  • 컨테이너(예: std::vector, std::array, std::string)나 배열을 자동으로 순회
  • 선언된 변수 c는 순회 중 각 요소를 참조
  • 읽기 전용으로 순회하려면 복사본이 생성되고, 수정하려면 참조로 받아야 한다!

예시

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main() {
    string str = "Hello";
    vector<int> nums = {1, 2, 3, 4, 5};

    // 문자열 순회
    for (char c : str) {
        cout << c << " "; // 출력: H e l l o
    }
    cout << endl;

    // 벡터 순회
    for (int num : nums) {
        cout << num << " "; // 출력: 1 2 3 4 5
    }
    cout << endl;

    // 참조로 순회하여 값 수정
    for (int& num : nums) {
        num *= 2;
    }
    for (int num : nums) {
        cout << num << " "; // 출력: 2 4 6 8 10
    }
    cout << endl;

    return 0;
}

3. 반복자 기반 for문

  • C++ STL(예: std::vector, std::list)에서 반복자를 사용해 순회하는 형태
  • 범위 기반 for문이 등장하기 전에는 이 방법을 주로 사용했습니다.

예시

#include <iostream>
#include <vector>

using namespace std;

int main() {
    vector<int> nums = {1, 2, 3, 4, 5};

    for (vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        cout << *it << " "; // 출력: 1 2 3 4 5
    }
    cout << endl;

    // 상수 반복자 (읽기 전용)
    for (vector<int>::const_iterator it = nums.cbegin(); it != nums.cend(); ++it) {
        cout << *it << " "; // 출력: 1 2 3 4 5
    }

    return 0;
}

4. 무한 루프

  • 조건 없이 계속 반복합니다. 주로 조건문과 break를 활용해 중간에 종료
  • while과 유사

예시

#include <iostream>
using namespace std;

int main() {
    int count = 0;

    for (;;) { // 무한 루프
        cout << "Loop " << count << endl;
        if (++count >= 5) break; // count가 5 이상이면 종료
    }

    return 0;
}

5. C++17 이상의 구조 분해 사용

  • 구조 분해(binding)를 활용해 더 복잡한 자료 구조를 순회

예시

#include <iostream>
#include <map>

using namespace std;

int main() {
    map<string, int> m = {{"Alice", 30}, {"Bob", 25}};

    for (const auto& [key, value] : m) {
        cout << key << ": " << value << endl;
    }

    return 0;
}
  • mapkeyvalue를 각각 key, value 변수에 바인딩하여 사용할 수 있습니다.

정리

  • 기본 for문: 초기값, 조건, 증감 설정이 필요할 때.
  • 범위 기반 for문: 컨테이너나 배열 순회 시 간결하게 사용.
  • 반복자 기반 for문: STL 컨테이너에서 세밀한 제어가 필요할 때.
  • 무한 루프: 종료 조건을 명시적으로 작성해야 할 때.
  • C++17 구조 분해: 복잡한 자료 구조를 순회할 때 간결하게 작성.



2. while 문의 사용 형태

while문은 조건에 따라 반복 실행되는 제어문이다.
for문과는 달리, 반복 횟수를 정하지 않고 조건이 참(true)인 동안 계속 실행되는 특징이 있다.
아래에 while문의 사용법과 다양한 활용법을 정리해보았다.


1. 기본 형태

while (조건식) {
    // 조건식이 참일 때 실행될 코드
}
  • 조건식: 반복 여부를 결정하는 표현식이다.
    • 조건식이 true이면 코드 블록을 실행하고, 다시 조건식을 확인.
    • 조건식이 false이면 반복문을 종료.

예시: 숫자 세기

#include <iostream>
using namespace std;

int main() {
    int i = 1; // 초기값
    while (i <= 5) { // 조건
        cout << i << " "; // 1 2 3 4 5 출력
        i++; // 증감
    }
    return 0;
}

2. 무한 루프

  • while (true)를 사용하면 조건이 항상 참이므로 무한히 반복된다.
  • 종료 조건은 break로 제어.

예시: 사용자 입력 반복

#include <iostream>
using namespace std;

int main() {
    while (true) {
        int input;
        cout << "숫자를 입력하세요 (0 입력 시 종료): ";
        cin >> input;
        if (input == 0) {
            cout << "프로그램 종료" << endl;
            break; // 반복문 종료
        }
        cout << "입력한 숫자: " << input << endl;
    }
    return 0;
}

3. 조건을 나중에 확인하는 do-while

  • do-while은 최소 한 번은 코드 블록을 실행한 뒤 조건을 확인한다.
do {
    // 실행할 코드
} while (조건식);

예시: 최소 한 번 실행 보장

#include <iostream>
using namespace std;

int main() {
    int num;
    do {
        cout << "양수를 입력하세요: ";
        cin >> num;
    } while (num <= 0); // 조건 확인
    cout << "입력한 숫자: " << num << endl;
    return 0;
}

4. while문과 배열 활용

  • while문을 사용해 배열 요소를 순회할 수 있다.

예시: 배열 합 계산

#include <iostream>
using namespace std;

int main() {
    int arr[] = {1, 2, 3, 4, 5};
    int size = sizeof(arr) / sizeof(arr[0]);
    int i = 0, sum = 0;

    while (i < size) {
        sum += arr[i]; // 배열 요소 합산
        i++;
    }

    cout << "배열의 합: " << sum << endl; // 출력: 15
    return 0;
}

5. 사용자 입력을 조건으로 반복

  • 사용자 입력에 따라 반복을 제어할 수 있다.

예시: 입력값이 0이 될 때까지 반복

#include <iostream>
using namespace std;

int main() {
    int num = -1;

    while (num != 0) {
        cout << "0을 입력하면 종료됩니다. 숫자를 입력하세요: ";
        cin >> num;
    }

    cout << "프로그램 종료" << endl;
    return 0;
}

6. 중첩 while

  • while문을 중첩하여 2차원 데이터를 처리할 수 있다.

예시: 2차원 배열 출력

#include <iostream>
using namespace std;

int main() {
    int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};
    int row = 0;

    while (row < 2) {
        int col = 0;
        while (col < 3) {
            cout << matrix[row][col] << " "; // 출력: 1 2 3 4 5 6
            col++;
        }
        cout << endl;
        row++;
    }

    return 0;
}

7. continue와 함께 사용

  • continue를 사용하면 특정 조건에서 나머지 코드를 건너뛰고 다음 반복으로 넘어간다.

예시: 짝수만 출력

#include <iostream>
using namespace std;

int main() {
    int i = 0;
    while (i <= 10) {
        i++;
        if (i % 2 != 0) {
            continue; // 홀수는 건너뜀
        }
        cout << i << " "; // 출력: 2 4 6 8 10
    }
    return 0;
}

8. while vs for

  • while문은 반복 횟수가 불확실하거나 조건으로 제어해야 하는 경우 적합하다.
  • for문은 반복 횟수가 명확한 경우에 적합하다.

9. 무한 루프 활용: 간단한 메뉴 프로그램

예시

#include <iostream>
using namespace std;

int main() {
    while (true) {
        int choice;
        cout << "1. 메뉴 A\n2. 메뉴 B\n3. 종료\n선택: ";
        cin >> choice;

        if (choice == 1) {
            cout << "메뉴 A를 선택했습니다.\n";
        } else if (choice == 2) {
            cout << "메뉴 B를 선택했습니다.\n";
        } else if (choice == 3) {
            cout << "프로그램을 종료합니다.\n";
            break;
        } else {
            cout << "잘못된 입력입니다. 다시 시도하세요.\n";
        }
    }
    return 0;
}

정리

  • while문은 조건에 따라 반복하는 경우 적합하며, 반복 횟수가 사전에 정해지지 않았을 때 주로 사용된다.
  • do-while은 최소 한 번 실행이 보장되는 경우에 사용된다.
  • breakcontinue로 제어할 수 있으며, 다양한 형태로 활용할 수 있다.

0개의 댓글