<백준 온라인 저지 : 2444번>
- 별 찍기 - 7 -
문제설명
문제:
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요
입력:
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
출력:
첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.
이 문제를 풀기 전에
- 이 문제의 출력은 지난 번에 해결했던 별 찍기 -5 번의 피라미드 모양과 별 찍기 - 6번의 역삼각형 모양을 붙여놓은 느낌이 든다. 두 문제의 코드를 적절히 조합하면 해결될 것 같다.
- 해당 출력은 가장 많은 별이 출력되는 줄을 기점으로 대칭이다. (이 점을 잘 생각해야 한다. 덕분에 곤혹을 치렀다.)
- 대칭이라는 것만 잘 생각한다면 매우 쉬운 문제.
내 소스 -1 (실패)
출력 결과가 제시한 출력과 유사해서 손쉽게 풀렸다고 생각했었지만, 그건 내 착오였다.
#include <stdio.h> int main() { int input; int i,j; scanf("%d",&input); for(i=1;i<=input;i++) // N번줄 및 개행 반복하기 위한 for문 { for(j=input-i;j>0;j--) // 공백을 출력하기 위한 for문 printf(" "); for(j=0;j<2*i-1;j++) // *을 출력하기 위한 for 문 printf("*"); printf("\n"); } for(i=input;i>0;i--) { for(j=input-i;j>0;j--) printf(" "); for(j=0;j<2*i-1;j++) printf("*"); printf("\n"); } return 0; }
이 코드는 틀린 코드다. 모양은 비슷하게 출력 되지만, 문제가 있다.
첫 중첩 for문에서 출력해주는 피라미드 모양의 별의 맨 밑 줄과, 두 번째 중첩 for문에서 출력하는 역삼각형 모양 별의 맨 윗줄의 별 개수가 겹친다.
즉, 문제는 다음 이미지와 같다.
가운데에 같은 갯수의 별이 출력된 것을 확인할 수 있다.
내 소스 - 2 성공
#include <stdio.h> int main() { int input; int i,j; scanf("%d",&input); for(i=1;i<=input;i++) // N번줄 및 개행 반복하기 위한 for문 { for(j=input-i;j>0;j--) // 공백을 출력하기 위한 for문 printf(" "); for(j=0;j<2*i-1;j++) // *을 출력하기 위한 for 문 printf("*"); printf("\n"); } for(i=input-1;i>0;i--) { for(j=input-i;j>0;j--) printf(" "); for(j=0;j<2*i-1;j++) printf("*"); printf("\n"); } return 0; }
이제 차이점이 보이는가? 두 번째 중첩 for문에서 i = input 이었던 대입식을 i = input-1으로 수정하여 똑같은 두 줄이 생기는 것을 막아주었다.
출력도 정상적으로 잘 이루어지는 모습을 확인할 수 있었다.
채점 결과
'Study (etc) > Problem Solving' 카테고리의 다른 글
[BOJ / Python ] 2739번 : 구구단 (0) | 2019.05.02 |
---|---|
[BOJ / C] 2445번 : 별 찍기 -8 (0) | 2019.04.11 |
[BOJ / C] 1546번 : 평균 (0) | 2019.04.05 |
[BOJ / C] 2443번 : 별찍기 -6 (0) | 2019.04.01 |
[BOJ / C] 10871번 : X보다 작은 수 (0) | 2019.04.01 |