Camp/T.I.L.

[TIL #19] 사각형 별 찍기

BVM 2024. 7. 17. 17:30

프로그래밍을 처음 배울 때 한번씩은 해 보는 별 찍기.

사각형으로 한번 찍어보고 삼각형으로 넘어갔던 것 같다.

 

그땐 마침 반복문을 배운 때였으니 별 찍기로 향하는 것은 당연했으리라.

코드를 이렇게 작성했었다.

#include <iostream>

int main() {
    int width = 10;  // 직사각형의 가로 길이
    int height = 5;  // 직사각형의 세로 길이

    // 세로 길이만큼 반복
    for (int i = 0; i < height; ++i) {
        // 가로 길이만큼 반복
        for (int j = 0; j < width; ++j) {
            std::cout << "*";
        }
        std::cout << std::endl;  // 한 줄 출력 후 줄 바꿈
    }

    return 0;
}

반복문을 활용한 정석적인 직사각형 별 찍기다.

 

지금 생각해 보니 이거보다 더 효율적인 방법이 있었다.

가로길이만큼의 문자열을 담은 변수를 선언하고 그걸 세로길이만큼 반복하면 된다.

#include <iostream>
#include <string>

using namespace std;

int main(void) {
    int a;
    int b;
    cin >> a >> b;
    
    string tmp(a, '*');
    
    for(int i = 0; i < b; ++i)
        cout << tmp << '\n';
    
    return 0;
}

코드가 훨씬 보기 좋아졌고 효율적이다.

``*``로 초기화 된 크기 ``a``의 문자열 변수 ``tmp``를 세로길이 ``b``만큼 반복한다.

그리고 줄 바꿈을 위해 ``endl``을 쓰는 것이 아닌 ``\n``를 사용해 플러싱 오버헤드를 줄였다.

 

처음 문제를 봤을 때, ``memset``을 통해 배열을 하나 선언한 후 그걸 반복할 생각을 했는데,

문제에 접근하는 사고방식이 달라진 것을 새삼 체감했다.