C++/C++ 강좌 문제 해답

[C++ 강좌 해답] 3-1. 반복문 정답 공개 및 해설

카루-R 2022. 2. 16. 15:13
반응형
 

[카루의 C++ 강좌] 3-1. 반복문과 for, while, do~while

드디어 재미있는 시간이 왔습니다. 이제 본격적으로 배열과 논리 연산자를 사용해 볼 겁니다. 반복문은 특정 구문을 여러 번 실행하기 위해서 사용합니다. 예를 들어 1부터 10까지 출력하는 프로

karupro.tistory.com

3-1 강좌의 도전 과제 해답을 설명합니다.

1. for문과 while문을 각각 사용해서 다음 결과를 출력하세요.

10
8
6
4
2

10부터 시작해서 2씩 줄여나가며 2까지 출력하는 코드입니다.

// 모범 답안 (전체 코드)
#include <iostream>

int main()
{
    for (int i{10}; i > 0; i -= 2)
        std::cout << i << std::endl;
}
// 모범 답안 (전체 코드)
#include <iostream>

int main()
{
    int i{10};
    while (i > 0)
    {
        std::cout << i << std::endl;
        i -= 2;
    }
}

답은 이렇게 for문과 while문을 사용한 각각 두 개의 정답이 있습니다.

i > 0 대신 i >= 2를 사용해도 됩니다.

2. for문을 이용하여 1부터 500까지의 수 중 7의 배수의 합계를 구하세요.

// 모범 답안 (전체 코드)
#include <iostream>

int main()
{
    int sum{};
    for (int i{7}; i <= 500; i += 7)
        sum += i;
    std::cout << "합계: " << sum << std::endl;
}

for문 밖에서 합을 저장하는 변수를 선언하고, for문에서는 7부터 시작하여 더하면 됩니다.

3. for문을 사용하여 구구단 8단을 출력하는 프로그램을 만들어보세요.

 
// 예시
8 * 1 = 8
8 * 2 = 16
...
// 모범 답안 (전체 코드)
#include <iostream>

int main()
{
    for (int i{1}; i <= 9; i++)
        std::printf("%d * %d = %d\n", 8, i, 8 * i);
}

만약 후에 C++20이 표준화된다면 아래처럼 작성하는 게 좋습니다.

// 모범 답안 (전체 코드)
#include <iostream>
#include <format>

int main()
{
    for (int i{1}; i <= 9; i++)
        std::cout << std::format("8 * {} = {}", i, 8 * i) << std::endl;
}

여러분들이 이 글을 보실 때 쯤이라면 C++20은 이미 충분히 보급이 되어있겠죠? 지금은 GCC나 Clang도 이를 지원하지 않습니다만..

4. [고난이도] 범위 기반 for문을 사용하여 사용자가 10개의 실수를 입력하면 그 평균을 출력하는 프로그램을 만들어 보세요.

// 모범 답안 (전체 코드)
#include <iostream>

int main()
{
    double arr[10], sum{};
    for (auto &var : arr)
    {
        std::cin >> var;
        sum += var;
    }
    std::cout << "평균값: " << sum / 10 << std::endl;
}

범위기반 for문을 사용하라는 것은 즉 배열을 사용하란 뜻입니다. 일단 C++을 처음 배우신 분들은 여기까지만 이해하시고 넘어가시면 됩니다.

만약 STL을 배우신 여러분들이라면 코드를 어떻게 작성했을까요?

// 모범 답안 (전체 코드)
#include <iostream>
#include <algorithm>

int main()
{
    double arr[10], sum{};
    std::for_each(std::begin(arr), std::end(arr), [&sum](auto& var){
        std::cin >> var;
        sum += var;});
    std::cout << "평균값: " << sum / 10 << std::endl;
}

이렇게 작성하실 수도 있겠죠. std::for_each()를 통해 for문을 대체합니다.

// 모범 답안 (전체 코드)
#include <iostream>
#include <algorithm>
#include <numeric>
using namespace std;
int main()
{
    double arr[10], sum{};
    for_each(begin(arr), end(arr), [](auto& var){ cin >> var; });
    sum = accumulate(begin(arr), end(arr), 0.);
    std::cout << "평균값: " << sum / 10 << std::endl;
}

뭐 다들 using 선언은 하시죠? 이렇게 람다를 줄여서 합계는 accumulate() 함수에 맡겨도 됩니다.

정답은 없으니 실제로 코딩할 땐 편한 걸로 하시면 됩니다. 물론 double arr[10] 대신 std::array<double, 10>을 쓰셔야겠죠.

반응형