2022. 10. 13. 14:34ㆍPS (Program Solving)/BOJ (백준)
문제 설명
https://www.acmicpc.net/problem/2446
접근 방법 - 이중 반복문을 이용한 출력 응용문제 (별 찍기-7 문제의 변형)
백준의 2446번 문제는 이중 반복문을 통해 출력문을 제어해야 하는 문제이다.
해당 문제는, 입력값에 대해 규칙적으로 별을 출력하여 해결해야 하는 문제이다.
이와 비슷한 유형의 문제에 대하여 이전에 작성한 ps글이 있는데, 이 글의 링크를 아래에 기재해놓았다.
이 유형에 어색하다면, 아래 링크도 함께 참고해보면 좋을 것이다.
https://smary-it.tistory.com/29
해당 문제 자체에 대한 해설이라면 아래에 자세히 기재되어있다.
혹여나 해당 문제를 해결하는 데에 어려움을 겪고 있다면, 아래의 설명과 코드를 참고해보길 바란다.
(사실 설명만 보면 이해가 잘 안 갈 수도 있기 때문에, 직접 시뮬레이션하면서 출력 결과를 추적해보는 방법을 추천하고 싶다.)
필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.
코드의 실행 순서
1) 값(n)을 입력받는다.
2) 반복문을 실행하여 아래의 연산을 취한다. (i: 행, j: 열)
(이때, i는 1부터 n*2 전까지 하여 n*2-1개의 행을 출력하도록 한다.)
- 임의의 변수 cnt를 i로 초기화하여 선언한다. 이 cnt로 현재 행에 대한 열 출력을 제어할 예정이다.
이때 cnt가 n보다 크다면 현재 행이 중간 행을 넘어섰음을 뜻하기 때문에, 대칭적으로 출력이 되도록 cnt의 값을 n*2-1로 다시 설정한다.
- 공백을 출력하는 반복문을 실행한다.
행이 중앙으로 향할수록 더 많이 출력되야하기 때문에, j가 1부터 cnt 전까지 하여 공백을 출력하도록 한다.
- 별을 출력하는 반복문을 실행한다.
출력되는 별이 홀수 개이며 인접한 행끼리 출력이 2개씩 차이가 난다. 또한 중앙으로 향할수록 별을 더 적게 출력해야 한다.
따라서, cnt부터 하여 n*2-cnt까지 하여 별을 출력하도록 한다.
(여기서, cnt는 해당 행에서 출력한 공백의 개수라 생각하면 된다.)
- 위 2개의 반복문이 종료될 때마다 개행을 출력하고, 다음 행에 대한 연산을 수행한다.
3) 출력이 모두 완료되었다면, 실행 종료한다.
성공한 코드
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#define endl '\n'
using namespace std;
//백준 2446번 코드
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n;
cin >> n;
for (int i = 1; i < n * 2; i++) {
int cnt = i;
if (cnt > n) {
cnt = n * 2 - i;
}
for (int j = 1; j < cnt; j++) {
cout << " ";
}
for (int j = cnt; j <= n * 2 - cnt; j++) {
cout << "*";
}
cout << endl;
}
}
제출 결과
(2022.07.28 백준 2446번 문제 제출 결과)
'PS (Program Solving) > BOJ (백준)' 카테고리의 다른 글
[백준 BOJ] 2535번 아시아 정보올림피아드 (C++/cpp) (0) | 2022.10.18 |
---|---|
[백준 BOJ] 11945번 뜨거운 붕어빵 (C++/cpp) (0) | 2022.10.14 |
[백준 BOJ] 7600번 문자가 몇갤까 (C++/cpp) (0) | 2022.10.13 |
[백준 BOJ] 11650번 좌표 정렬하기 (C++/cpp) (0) | 2022.10.13 |
[백준 BOJ] 5554번 심부름 가는 길 (Java) (0) | 2022.10.12 |