[백준] 2438번 : 별 찍기 - 1 - [C++]
- 문제
- 알고리즘 [접근 방법]
반복문의 꽃이라 할 수 있는 문제인 별 찍기 문제다.
아마 많은 분들이 프로그래밍 언어에서 반복문을 접할 때 한 번쯤은 접하게 될 문제들일 것이다. 이 번 문제뿐만 아니라 다양한 형식으로 별을 찍는 문제들이 있으니, 만약 반복문 풀이에 자신이 있다면, 백준 문제에 올라와있는 다양한 별 찍기 문제들을 풀어보는 것도 좋을 것 같다.
일단, 그동안 반복문을 풀면서 반복문이 어떻게 구성되는지는 다들 아실거라 본다. 그동안 배워왔던 반복문의 구조를 어떻게 문제에서 주어진 도형을 어떻게 찍을지가 관건일 것이다.
아래는 5를 입력받았을 때, 찍히는 도형이다.
문제를 읽어보면 "첫째 줄에는 별 1개, 둘째 줄에는 별 2개, N번째 줄에는 별 N개를 찍는 문제" 라고 적혀있는 만큼 이를 좀 더 이해하기 편하게 그림으로 보자면 다음과 같다.
위를 반복문으로 짜보자면 다음과 같을 것이다.
// N번만큼 반복
for(int i = 1; i <= N; i++) {
// i행에서는 i개만큼 별을 출력
for(int j = 1; j <= i; j++) {
print("*");
}
// 해당 행이 출력이 끝났으면 반드시 줄바꿈을 해준다.
print("\n");
}
행을 기준으로 N번만큼 반복하고, i번째 행에서는 i만큼 별을 출력해야한다.
그리고 중요한 점은, 해당 줄(행)의 별들을 모두 출력했으면, 반드시 줄바꿈을 해주어야 한다. 이 점 잊지말고 꼭 적용해주도록 하자.
이를 토대로 알고리즘을 작성하면 된다.
- 2가지 방법을 사용하여 풀이한다.
빠른 A+B를 풀어보셨다면 알겠지만, C++는 입출력이 기본적으로 C의 기본 입출력과 동기화 되어있어서 상대적으로 느리다. 그래서 두 io의 동기화를 끊어주어 이득을 볼 수 있지만, 아직 익숙치 않은 분들도 계실 것 같아 일반적인 방법과 입출력 향상 방법 이렇게 두 가지 방법을 보여주고자 한다.
알고리즘 자체는 위 내용을 그대로 적용하면 된다.
1. 기본 입출력
2. 향상 된 입출력
- 풀이
- 방법 1 : [기본 입출력]
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
int N;
cin >> N;
// N번만큼 반복
for (int i = 1; i <= N; i++) {
// i행에서는 i개만큼 별을 출력
for (int j = 1; j <= i; j++) {
cout << "*";
}
// 해당 행이 출력이 끝났으면 반드시 줄바꿈을 해준다.
cout << "\n";
}
return 0;
}
가장 기본적인 방법이라 할 수 있겠다.
뭐,, 별다를게 없다...
- 방법 2 : [향상 된 입출력]
앞서 말했듯, C와 C++의 표준 입출력 동기화를 끊어주는 방법이다.
만약 필자의 직전 글을 보면 알겠지만 조금 다른 것이 입력과 출력의 묶음(tie)을 끊어줄 필요가 없다. 왜냐하면, 입력이 한 번 들어온 다음에 출력할 내용밖에 없기 때문에 입력과 출력이 서로 번갈아가면서 사용된다면 서로 묶인 것을 풀어주면 되나, 이 번 문제는 그럴 필요가 없기 때문이다.
이 부분에 대해 잘 모른다면 다음 글을 참고하시길 바란다.
#include <iostream>
using namespace std;
int main(int argc, char const *argv[]) {
ios_base::sync_with_stdio(false); // 동기화 된 두 스트림을 끊어준다.
int N;
cin >> N;
// N번만큼 반복
for (int i = 1; i <= N; i++) {
// i행에서는 i개만큼 별을 출력
for (int j = 1; j <= i; j++) {
cout << "*";
}
// 해당 행이 출력이 끝났으면 반드시 줄바꿈을 해준다.
cout << "\n";
}
return 0;
}
크게 어려울 것은 없을 것이다.
- 성능
채점 번호 : 29090991 - 방법 2 : 향상 된 입출력
채점 번호 : 29090984 - 방법 1 : 기본 입출력
이 번 문제는 입출력 모두 양이 적어 향상의 의미가 없었던 것 같다.
- 정리
이 번 문제는 가장 기초적인 반복문의 활용 문제였다. 문제도 어렵지 않았고 제시한 문장이 직관적으로 바로 짤 수 있게 되어있다보니 아마 다들 어렵지 않게 풀었을 것이다.
하지만, 이 문제만이 아닌 별 찍기는 정말 다양하게 활용하여 풀 수 있기 때문에 이러한 부류의 문제들은 한 번 수식으로 정리하고 가는 습관을 갖는 것이 좋을 것이다.
그래야 후에 다른 별 찍기 문제가 나와도 어렵지 않게 풀 수 있을 것이다.
'C++ - 백준 [BAEK JOON] > 반복문' 카테고리의 다른 글
[백준] 10952번 : A+B - 5 - [C++] (2) | 2021.06.13 |
---|---|
[백준] 2439번 : 별 찍기 - 2 - [C++] (1) | 2021.05.11 |
[백준] 11022번 : A+B - 8 - [C++] (0) | 2021.05.02 |
[백준] 11021번 : A+B - 7 - [C++] (0) | 2021.04.26 |
[백준] 15552번 : 빠른 A+B - [C++] (6) | 2021.03.28 |