1-11. 코딩 테스트: 조건문 및 반복문 (명확하게)

1. 조건문: 의사 결정의 기반

프로그래밍에서 조건문은 프로그램의 흐름을 제어하는 핵심적인 도구입니다. 사람의 사고 과정처럼, 조건문은 특정 조건이 참(true)인지 거짓(false)인지 평가하여 그 결과에 따라 다른 코드 블록을 실행하도록 합니다. 이러한 의사 결정 능력은 프로그램이 다양한 상황에 유연하게 대처하고, 사용자 입력, 데이터 값 또는 외부 환경에 따라 다르게 동작하도록 만듭니다. 조건문은 코딩 테스트뿐만 아니라 실제 소프트웨어 개발에서도 가장 기본적이면서도 중요한 개념 중 하나입니다.

1) 조건문의 필요성

현실 세계를 생각해 봅시다. "만약 오늘 비가 온다면, 우산을 챙겨야 한다."와 같은 의사 결정은 매일 일상적으로 이루어집니다. 프로그래밍에서도 이와 유사한 논리가 필요합니다. 예를 들어, 사용자에게 입력된 숫자가 양수인지 음수인지 판단하여, 그 결과에 따라 다른 메시지를 출력하거나 다른 연산을 수행해야 할 수 있습니다. 이처럼 조건에 따라 다른 동작을 수행하게 함으로써, 프로그램은 더욱 동적이고 유연하게 반응할 수 있습니다.

2) 조건문의 종류

가장 기본적인 조건문은 if 문입니다. if 문은 특정 조건이 참일 경우에만 코드 블록을 실행합니다. if-else 문은 if 문의 조건을 만족하지 않을 경우 실행될 코드 블록을 제공하며, if-elif-else (또는 if-else if-else) 문은 여러 개의 조건을 순차적으로 평가하여, 각 조건에 맞는 코드 블록을 실행할 수 있도록 합니다. 마지막으로 switch (또는 switch-case) 문은 여러 개의 가능한 값에 따라 다른 코드 블록을 실행해야 할 때 효율적입니다.

2. if 문: 단일 조건 평가

if 문은 조건문의 가장 기본적인 형태입니다. if 문은 괄호 안에 있는 조건식을 평가하여, 그 결과가 true이면 if 문 다음에 오는 코드 블록을 실행합니다. false이면 해당 블록은 건너뛰고, if 문 이후의 코드가 실행됩니다.

1) if 문의 기본 구조

대부분의 프로그래밍 언어에서 if 문의 기본 구조는 다음과 같습니다.

if (condition) {
  // condition이 true일 때 실행되는 코드 블록
}

여기서 conditiontrue 또는 false로 평가되는 표현식입니다. 예를 들어, 변수 x가 10보다 큰지 확인하는 조건은 x > 10과 같이 표현할 수 있습니다.

2) 예시: 정수 값의 양수 여부 판단

#include <iostream>

int main() {
    int number = 15;

    if (number > 0) {
        std::cout << "양수입니다." << std::endl;
    }

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

위의 예시에서 number가 0보다 크므로, "양수입니다."가 출력됩니다. 만약 number가 음수였다면 if 문 안의 코드는 실행되지 않고 "프로그램 종료."만 출력되었을 것입니다.

3. if-else 문: 두 가지 선택지

if-else 문은 if 문의 확장된 형태로, 조건이 참일 경우와 거짓일 경우, 두 가지 경우 모두에 대한 동작을 정의할 수 있게 해줍니다. 즉, 조건이 참일 때 실행할 코드 블록과, 조건이 거짓일 때 실행할 코드 블록을 모두 제공합니다.

1) if-else 문의 기본 구조

if (condition) {
  // condition이 true일 때 실행되는 코드 블록
} else {
  // condition이 false일 때 실행되는 코드 블록
}

2) 예시: 정수 값의 양수 또는 음수 여부 판단

#include <iostream>

int main() {
    int number = -5;

    if (number > 0) {
        std::cout << "양수입니다." << std::endl;
    } else {
        std::cout << "음수 또는 0입니다." << std::endl;
    }

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

위의 예시에서 number가 음수이므로, "음수 또는 0입니다."가 출력됩니다.

4. if-elif-else 문 (또는 if-else if-else 문): 다중 조건 평가

if-elif-else (또는 if-else if-else) 문은 여러 개의 조건을 순차적으로 평가해야 할 때 사용됩니다. 각 elif (또는 else if) 절은 새로운 조건을 제공하며, 이전 조건들이 모두 거짓일 경우에만 해당 조건을 평가합니다. 마지막 else 절은 모든 ifelif 조건이 거짓일 경우 실행되는 코드 블록을 제공합니다.

1) if-elif-else 문의 기본 구조 (Python)

if condition1:
    # condition1이 true일 때 실행되는 코드 블록
elif condition2:
    # condition1이 false이고 condition2가 true일 때 실행되는 코드 블록
elif condition3:
    # condition1, condition2가 false이고 condition3이 true일 때 실행되는 코드 블록
else:
    # 모든 조건이 false일 때 실행되는 코드 블록

2) if-else if-else 문의 기본 구조 (C++, Java 등)

if (condition1) {
    // condition1이 true일 때 실행되는 코드 블록
} else if (condition2) {
    // condition1이 false이고 condition2가 true일 때 실행되는 코드 블록
} else if (condition3) {
    // condition1, condition2가 false이고 condition3이 true일 때 실행되는 코드 블록
} else {
    // 모든 조건이 false일 때 실행되는 코드 블록
}

3) 예시: 점수에 따른 학점 부여

score = 85

if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
elif score >= 60:
    print("D")
else:
    print("F")

위의 예시에서 score가 85이므로, "B"가 출력됩니다.

5. switch 문: 다중 분기 (선택)

switch 문은 변수의 값에 따라 여러 개의 코드 블록 중 하나를 선택하여 실행하는 데 사용됩니다. if-elif-else 문과 유사한 기능을 수행할 수 있지만, switch 문은 특정 값에 대한 비교를 수행할 때 코드를 더 간결하고 가독성 있게 만들 수 있습니다. 특히, 정수형 또는 열거형(enum) 값에 대한 여러 개의 분기를 처리할 때 유용합니다.

1) switch 문의 기본 구조

switch (expression) {
    case value1:
        // expression이 value1과 같을 때 실행되는 코드
        break;
    case value2:
        // expression이 value2와 같을 때 실행되는 코드
        break;
    ...
    default:
        // expression이 어떤 case와도 일치하지 않을 때 실행되는 코드
        break;
}
  • expression: 평가될 표현식 (정수형, 문자형 또는 열거형)
  • case value: expression의 값과 비교할 값
  • break: switch 문을 종료하고 다음 문으로 진행

2) 예시: 요일에 따른 활동

#include <iostream>

int main() {
    int day = 3; // 1: 월요일, 2: 화요일, ..., 7: 일요일

    switch (day) {
        case 1:
            std::cout << "월요일: 회의" << std::endl;
            break;
        case 2:
            std::cout << "화요일: 팀 미팅" << std::endl;
            break;
        case 3:
            std::cout << "수요일: 프로젝트 작업" << std::endl;
            break;
        case 4:
            std::cout << "목요일: 코드 리뷰" << std::endl;
            break;
        case 5:
            std::cout << "금요일: 데모 준비" << std::endl;
            break;
        case 6:
        case 7:
            std::cout << "주말: 휴식" << std::endl;
            break;
        default:
            std::cout << "잘못된 요일 입력" << std::endl;
    }

    return 0;
}

위 예시에서 day가 3이므로 "수요일: 프로젝트 작업"이 출력됩니다. break 문을 사용하지 않으면, 해당 case 이후의 모든 case 블록이 실행됩니다 (fallthrough).

6. 반복문: 코드의 반복 실행

반복문은 특정 코드 블록을 여러 번 반복해서 실행하는 데 사용됩니다. 코딩 테스트에서 주어진 문제를 해결하기 위해, 데이터의 처리, 계산, 또는 특정 작업을 반복적으로 수행해야 할 때 반복문은 필수적인 도구입니다. 반복문을 통해 중복된 코드를 줄이고, 코드의 가독성을 높이며, 문제 해결 과정을 효율적으로 만들 수 있습니다.

1) 반복문의 종류

가장 기본적인 반복문은 for 문입니다. for 문은 지정된 횟수만큼 코드 블록을 반복하는 데 사용됩니다. while 문은 특정 조건이 참인 동안 코드 블록을 반복하며, do-while 문은 while 문과 유사하지만, 코드 블록을 최소 한 번은 실행한 후에 조건을 평가합니다.

7. for 문: 횟수 기반 반복

for 문은 반복 횟수가 명확하게 정해져 있는 경우에 가장 적합합니다. for 문은 초기화, 조건 평가, 반복 후 작업의 세 부분으로 구성됩니다. 초기화는 반복을 시작하기 전에 실행되는 부분이며, 조건 평가는 각 반복 전에 실행되어 반복을 계속할지 여부를 결정합니다. 반복 후 작업은 각 반복 후에 실행됩니다.

1) for 문의 기본 구조

for (initialization; condition; increment/decrement) {
    // 반복할 코드 블록
}
  • initialization: 반복 변수를 초기화하는 부분 (예: int i = 0;)
  • condition: 반복을 계속할지 여부를 결정하는 조건 (예: i < 10;)
  • increment/decrement: 각 반복 후에 실행되는 부분 (예: i++; 또는 i--;)

2) 예시: 1부터 10까지의 숫자 출력

#include <iostream>

int main() {
    for (int i = 1; i <= 10; i++) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
    return 0;
}

위의 예시에서 for 문은 i를 1부터 10까지 1씩 증가시키면서, 각 숫자를 출력합니다.

for문 설명 뒤

8. while 문: 조건 기반 반복

while 문은 특정 조건이 참인 동안 코드 블록을 반복합니다. for 문과 달리, 반복 횟수가 명확하게 정해져 있지 않고, 조건의 변화에 따라 반복 여부가 결정됩니다.

1) while 문의 기본 구조

while (condition) {
    // condition이 true인 동안 반복될 코드 블록
}

2) 예시: 사용자 입력을 받는 예제

#include <iostream>

int main() {
    int input;

    std::cout << "0을 입력하면 종료됩니다." << std::endl;

    while (true) { // 무한 루프
        std::cout << "숫자를 입력하세요: ";
        std::cin >> input;

        if (input == 0) {
            break; // 루프 종료
        }
        std::cout << "입력된 숫자: " << input << std::endl;
    }

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

이 예제에서 while 문은 true를 조건으로 사용하므로, 무한 루프를 형성합니다. 사용자가 0을 입력하면 break 문을 통해 루프를 종료합니다.

while문 설명 뒤

9. do-while 문: 최소 한 번 실행 보장

do-while 문은 while 문과 유사하지만, 코드 블록을 최소 한 번은 실행한 후 조건을 평가합니다. 즉, 조건이 처음부터 거짓이라도, 코드 블록은 한 번 실행됩니다.

1) do-while 문의 기본 구조

do {
    // 최소 한 번 실행될 코드 블록
} while (condition);

2) 예시: 메뉴 선택 예제

#include <iostream>

int main() {
    int choice;

    do {
        std::cout << "메뉴를 선택하세요 (1: 옵션1, 2: 옵션2, 0: 종료): ";
        std::cin >> choice;

        switch (choice) {
            case 1:
                std::cout << "옵션1 선택" << std::endl;
                break;
            case 2:
                std::cout << "옵션2 선택" << std::endl;
                break;
            case 0:
                std::cout << "프로그램 종료" << std::endl;
                break;
            default:
                std::cout << "잘못된 선택" << std::endl;
        }
    } while (choice != 0);

    return 0;
}

이 예제에서 사용자는 0을 입력할 때까지 메뉴를 반복해서 선택할 수 있습니다.

10. 반복문 제어: breakcontinue

반복문 내에서 breakcontinue 문을 사용하여 반복의 흐름을 제어할 수 있습니다.

1) break

break 문은 현재 실행 중인 반복문을 즉시 종료하고, 반복문 이후의 코드로 이동합니다. switch 문에서 break 문은 해당 case 블록을 종료하는 데 사용됩니다.

2) continue

continue 문은 현재 반복의 나머지 부분을 건너뛰고, 다음 반복을 시작합니다. 즉, continue 문 이후의 코드는 실행되지 않고, 다음 반복으로 바로 넘어갑니다.

3) 예시: breakcontinue 사용

#include <iostream>

int main() {
    // break 예시
    for (int i = 1; i <= 10; i++) {
        if (i == 5) {
            break; // i가 5일 때 반복 종료
        }
        std::cout << i << " ";
    }
    std::cout << std::endl; // 출력: 1 2 3 4

    // continue 예시
    for (int i = 1; i <= 5; i++) {
        if (i <mark class="highlight"> 3) {
            continue; // i가 3일 때 다음 반복으로
        }
        std::cout << i << " ";
    }
    std::cout << std::endl; // 출력: 1 2 4 5

    return 0;
}

11. 조건문과 반복문의 활용: 코딩 테스트에서의 전략

코딩 테스트에서 조건문과 반복문은 문제 해결의 핵심적인 도구입니다. 효율적인 코드를 작성하기 위해서는 문제의 요구사항을 정확하게 이해하고, 적절한 조건문과 반복문을 선택하여 사용하는 것이 중요합니다.

1) 문제 분석

문제를 해결하기 전에 먼저 문제의 요구사항을 명확하게 분석해야 합니다. 어떤 조건에 따라 다른 동작을 수행해야 하는지, 그리고 어떤 작업을 반복해야 하는지를 파악해야 합니다. 문제의 조건을 정확히 이해하고, 데이터를 어떻게 처리할 것인지 결정해야 합니다.

2) 적절한 구조 선택

문제의 요구사항에 따라 if-else, for, while, switch 문 등을 적절하게 선택해야 합니다. 예를 들어, 특정 조건을 만족하는 값을 찾아야 하는 경우 if-else 문을 사용하고, 데이터 집합을 순회하며 처리해야 하는 경우 for 또는 while 문을 사용합니다. 여러 값에 따라 다른 동작을 수행해야 하는 경우 switch 문을 고려할 수 있습니다.

3) 효율적인 코드 작성

코드의 효율성을 고려하여 작성해야 합니다. 불필요한 연산을 피하고, 가능한 한 적은 반복 횟수로 문제를 해결해야 합니다. 시간 복잡도와 공간 복잡도를 고려하여 알고리즘을 설계==하고, 최적화된 코드를 작성해야 합니다. breakcontinue 문을 적절히 활용하여 코드의 흐름을 제어하고, 불필요한 연산을 줄일 수 있습니다.

4) 예시: 정렬된 배열에서 특정 값 검색

이진 검색(Binary Search) 알고리즘은 정렬된 배열에서 특정 값을 효율적으로 검색하는 알고리즘입니다.

#include <iostream>
#include <vector>
#include <algorithm> // std::sort

int binarySearch(const std::vector<int>& arr, int target) {
    int left = 0;
    int right = arr.size() - 1;

    while (left <= right) {
        int mid = left + (right - left) / 2; // overflow 방지

        if (arr[mid] == target) {
            return mid; // 찾았을 경우 인덱스 반환
        } else if (arr[mid] < target) {
            left = mid + 1; // target이 오른쪽에 있음
        } else {
            right = mid - 1; // target이 왼쪽에 있음
        }
    }

    return -1; // 찾지 못한 경우 -1 반환
}

int main() {
    std::vector<int> arr = {5, 2, 9, 1, 5, 6};
    std::sort(arr.begin(), arr.end()); // 배열 정렬

    int target = 6;
    int index = binarySearch(arr, target);

    if (index != -1) {
        std::cout << "값 " << target << "의 인덱스: " << index << std::endl;
    } else {
        std::cout << "값 " << target << "을 찾을 수 없음" << std::endl;
    }

    return 0;
}

이 예시에서는 while 문을 사용하여 이진 검색 알고리즘을 구현했습니다. 배열의 중간값을 계산하고, if-else 문을 사용하여 검색 범위를 좁혀나가며, 목표 값을 찾을 때까지 반복합니다.

이진 검색 알고리즘 설명 뒤

12. 주의사항과 트러블슈팅

1) 무한 루프

while 문에서 조건이 항상 참이 되는 경우, 무한 루프에 빠질 수 있습니다. 무한 루프는 프로그램의 실행을 멈추지 않게 하여, 시스템 리소스를 소모시키고 프로그램이 응답하지 않게 만들 수 있습니다. while 문의 조건이 변경될 수 있도록 코드 블록 내에서 적절한 로직을 추가하거나, break 문을 사용하여 루프를 종료하도록 해야 합니다.

2) 조건문 오작동

if-else 문 또는 switch 문에서 조건을 잘못 설정하거나, break 문을 누락하는 경우 의도하지 않은 결과가 발생할 수 있습니다. 조건식의 논리적 오류를 검토하고, switch 문에서 각 case 블록에 break 문이 포함되어 있는지 확인해야 합니다.

3) 성능 문제

반복문 내에서 불필요한 연산을 수행하거나, 복잡한 연산을 반복적으로 수행하는 경우, 프로그램의 성능이 저하될 수 있습니다. 루프 밖으로 이동할 수 있는 연산은 루프 밖으로 이동하고, 연산의 횟수를 최소화하여, 코드의 효율성을 높여야 합니다.

13. 마치며

조건문과 반복문은 프로그래밍의 기본적이면서도 가장 중요한 개념입니다. 이들을 통해 프로그램의 흐름을 제어하고, 다양한 상황에 대응할 수 있는 유연한 코드를 작성할 수 있습니다. 코딩 테스트에서 이러한 개념에 대한 이해는 필수적이며, 숙련된 문제 해결 능력을 갖추는 데 중요한 역할을 합니다. 각 개념의 원리를 이해하고, 실제 문제에 적용하는 연습을 통해, 코딩 실력을 향상시키고, 더 나아가 실무에서도 유용하게 활용할 수 있을 것입니다.

비슷한 글 추천

Comments (0)

No comments yet. Be the first to comment!