https://www.acmicpc.net/problem/2438
쉬운 문제지만 제가 공부한 내용을 기록해야 된다고 생각해서 작성했습니다.
이번 문제에서 요구하는 것은 입력한 값 N을 1~N번째 줄까지 1~T번 '*'를 차례대로 출력하는 것입니다.
저는 C++이 익숙하지 않아서 처음에 *을 for문으로 i번씩 곱해서 출력하고 싶었지만, 막막해서 이중 for문을 작성했습니다. 제출한 후에 제가 원래 원하던 방법을 구현하기 위해 찾아본 결과 곱셈연산의 개념은 아니지만 비슷하게 있었습니다.
출력 내용에는 '첫째 줄부터 N번째 줄까지 차례대로 별을 출력한다.' 으로 나와있습니다. 이 말은 즉, 처음에는 반복문을 N번 작동해서 출력해야 된다는 사실을 알 수 있습니다.
예제 출력을 보면 "*"을 1번째 줄에는 1개, 2번째 줄에는 2개... N번째 줄에는 N개씩 출력되는 것을 확인할 수 있습니다. 그림으로 표현하면 다음과 같습니다.
i = 1, i <= N 으로 표현해도 무방합니다.
아무튼 이 코드를 작성할 때 "*"가 어떻게 해야 저렇게 출력할 수 있을지를 고민해야 됩니다.
/*
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로 해도 괜찮고, 본인이 이해하기 쉽게 작성하면 됩니다. 잘못 작성하면 시간이 매우 걸리는 것이 중첩 반복문이기 때문에 다른 문제에서 적절하게 사용하는 것이 중요합니다.
'std::string' 클래스는 문자('char')의 배열로 이뤄져 있습니다. 각 문자는 배열의 하나의 요소로 저장되고 문자열의 끝은 null 문자('\0')로 표시됩니다.
string(문자열의 길이, char형 문자) 를 입력하고, 이것을 for문으로 통해 출력합니다. 즉, string(i, '*') 로 작성한다면 for문으로 통해 *가 i번씩 출력될 수 있습니다.
여기서는 i가 문자열의 길이를 받는 인자 역할을 해야 되기 때문에 for문 작성할 때 i = 1로 시작하는 것은 필수적입니다.
1번째 | 이중 for문(중첩 for문)
#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); 를 작성하지 않았지만 추가하셔야 됩니다.
#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 클래스로 생성된 문자열로 취급하기 때문입니다. 작은 따옴표를 사용해야 됩니다.