[백준] 2439번 : 별 찍기 - 2 - [C++]
- 문제
직전의 별 찍기 - 1 문제랑 거의 닮은 문제다.
조금만 고민해보면 그리 어렵지 않은 문제이니 한 번 살펴보도록 하자.
- 알고리즘 [접근 방법]
아마 대부분은 이 문제를 쉽게 푸셨을 것이다. 그래도 쉽다고 그냥 포스팅을 skip할 순 없기에..
필자가 항상 강조하는 건 반복문을 이용한 별 찍기를 할 때, 수식으로 한 번 정리하고 가면 좋다는 것이다. 이 번 문제의 경우 직전 문제인 별 찍기 - 1 문제와 다른 점이 바로 공백을 먼저 출력한 뒤 별을 찍는다는 것이다.
위 문제를 보면 N(행)이 증가 할 때 마다 별을 찍는 개수는 1개씩 증가한다. 반대로 공백의 개수는 한 개씩 준다. 그리고 마지막 줄은 N개만큼 출력이 되어야 한다는 것이다.
이를 이해하기 쉽게 이미지로 보면 다음과 같다.
이 때 N은 우리가 받은 입력 N이다.
이런 식으로 짜이기 때문에, 결국 for문 안에는 각 반복 단계별 두 가지 조건이 들어가야한다는 것이다.
대략 다음과 같은 구조로 짜인다.
for(int row = 1; row <= N; row++) {
// 공백은 N - row개 만큼 출력한다.
for(int i = 0; i < N - row; i++) {
print(" ");
}
// 별은 row개만큼 출력한다.
for(int i = 0; i < row; i++) {
print("*");
}
// 한 행의 출력이 끝나면 개행(줄바꿈)
print("\n");
}
위를 도태로 알고리즘을 구성하면 된다.
- 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;
for (int row = 1; row <= N; row++) {
// 공백은 N - row개 만큼 출력한다.
for (int i = 0; i < N - row; i++) {
cout << ' ';
}
// 별은 row개만큼 출력한다.
for (int i = 0; i < row; i++) {
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;
for (int row = 1; row <= N; row++) {
// 공백은 N - row개 만큼 출력한다.
for (int i = 0; i < N - row; i++) {
cout << ' ';
}
// 별은 row개만큼 출력한다.
for (int i = 0; i < row; i++) {
cout << '*';
}
// 한 행의 출력이 끝나면 개행(줄바꿈)
cout << '\n';
}
return 0;
}
- 성능
채점 번호 : 29179617 - 방법 2 : 개선 된 입출력
채점 번호 : 29179610 - 방법 1 : 기본 입출력
보면 아무래도 출력량이 적다보니 성능상의 차이는 없는 것 같다.
- 정리
워낙 쉬웠던 문제라 크게 어렵진 않았을 것이다.
다만, 이러한 부류의 반복문으로 푸는 문제는 대체로 거의 다 수식으로 정리할 수 있기 때문에 필자처럼 수식으로 정리해보는 것이 문제를 푸는데 훨씬 수월 할 것이다.
그래야 앞으로 문제를 풀이 할 때 많은 도움이 될 것이다. (암산, 상상만 갖고는 안풀리는 문제들이 많아질 것이다)
만약 어렵거나 이해가 되지 않은 부분이 있다면 언제든 댓글 남겨주시면 최대한 빠르게 답변드리겠다.
'C++ - 백준 [BAEK JOON] > 반복문' 카테고리의 다른 글
[백준] 10951번 : A + B - 4 - [C++] (25) | 2021.06.29 |
---|---|
[백준] 10952번 : A+B - 5 - [C++] (2) | 2021.06.13 |
[백준] 2438번 : 별 찍기 - 1 - [C++] (0) | 2021.05.08 |
[백준] 11022번 : A+B - 8 - [C++] (0) | 2021.05.02 |
[백준] 11021번 : A+B - 7 - [C++] (0) | 2021.04.26 |