Post

[백준BOJ2438 C++] 별 찍기 - 1

[백준BOJ2438 C++] 별 찍기 - 1

문제

https://www.acmicpc.net/problem/2438


풀이

첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다는 말은 처음에는 반복문을 N번 작동해서 출력해야 된다는 사실을 알 수 있다. 예제 출력을 보면 “*“을 1번째 줄에는 1개, 2번째 줄에는 2개… N번째 줄에는 N개씩 출력되는 것을 확인할 수 있다.


  • 1.이중 for문(중첩 for문)
    i for문으로 통해 출력을 N번 하도록 작성한다. 이후 i for문 안에 또다른 for문을 작성한다. 이것이 이중 for문이다.
1
2
3
4
5
6
7
/*
i for문 { 줄을 n번 출력하도록 한다.
   j for 문 { "\*"을 i번 출력한다.
       (수행문)
   }
}
*/

바깥 for문(i for문)의 i가 0에서 1로 넘어가기 전에 안쪽 for문(j for문)에서 출력을 수행하는 것이다. j는 i를 기준으로 해서 “*” 출력을 i번만큼 한 후에, j가 i보다 값이 커졌을 경우 다시 바깥 for문으로 이동한다.

헷갈릴 경우에는 j = 1; j <= i+1로 해도 괜찮고, 본인이 이해하기 쉽게 작성하면 된다. 잘못 작성하면 시간이 매우 걸리는 것이 중첩 반복문이기 때문에 다른 문제에서 적절하게 사용하는 것이 중요하다.


  • 2.std::string 클래스 string(문자열의 길이, char형 문자)

‘std::string’ 클래스는 문자(‘char’)의 배열로 이뤄져 있다. 각 문자는 배열의 하나의 요소로 저장되고 문자열의 끝은 null 문자(‘\0’)로 표시된다.

string(문자열의 길이, char형 문자) 를 입력하고, 이것을 for문으로 통해 출력한다. 즉, string(i, ‘*’) 로 작성한다면 for문으로 통해 *가 i번씩 출력될 수 있다.

여기서는 i가 문자열의 길이를 받는 인자 역할을 해야 되기 때문에 for문 작성할 때 i = 1로 시작하는 것은 필수적이다.


제출

1번째 | 이중 for문(중첩 for문)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int T;
	cin >> T;
	for (int i = 0; i < T; i++) {
		for (int j = 0; j <= i; j++) {
			cout << "*";
		}
		cout << "\n";
	}

	return 0;
}


2번째 | std::string 클래스 해당 코드는 테스트에 가까워서 ios_base::sync_with_stdio(false); cin.tie(NULL); 를 작성하지 않았지만 추가해야 된다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
#include <string>
using namespace std;

int main() {
    int N;
    cin >> N;

    for (int i = 1; i <= N; ++i) {
        string stars(i, '*');
        cout << stars << "\n";
    }

    return 0;
}

메모

해당 문제를 기록하는 과정에서 1번째 코드에서는 큰 따옴표(““)를 사용했고 2번째 코드에서는 작은 따옴표(‘‘)를 사용했음을 깨달았다.

  • ”*“

문자열을 나타내는 표현; std::string 클래스에서 표현할 때 나타내는 표현. string star = “*”; 라고 한다면 *로 이루어진 문자열이 생성하는 것.


  • ’*’

단일 문자를 나타내는 표현; char 데이터 타입으로 표현할 때 나타내는 표현. char star = ‘*’; 라고 한다면 단일문자 *를 나타내는 것.

앞서 말한 string(문자열의 길이, char형 문자) 의 조건에 맞추기 위해서 “*”, 큰 따옴표로 작성하면 안되는 것이다. 큰 따옴표로 작성하면 string 클래스로 생성된 문자열로 취급하기 때문이다. 작은 따옴표를 사용해야 된다.

This post is licensed under CC BY 4.0 by the author.