티스토리 뷰

문제 링크 : https://www.acmicpc.net/problem/10996

 

10996번: 별 찍기 - 21

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

www.acmicpc.net

문제 |

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

 

입력 |

첫째 줄에 N(1첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

 

출력 |

첫째 줄부터 차례대로 별을 출력한다.

 

#include <stdio.h>
#include <iostream>
using namespace std;

int main(void) {
	int n;
	int re = 0;
	cin >> n;
	for (int k = 0; k < n; k++)
	{
		if (n % 2 == 0)
		{
			re = n / 2;
			for (int i = 0; i < re; i++)
			{
				printf("* ");
			}
			printf("\n");
			for (int i = 0; i < re; i++)
			{
				printf(" *");
			}
		}
		else if (n % 2 == 1)
		{
			re = n / 2;
			for (int j = 0; j < re + 1; j++)
			{
				printf("* ");
			}
			printf("\n");
			for (int j = 0; j < re; j++)
			{
				printf(" *");
			}
		}
		printf("\n");
	}
	return 0;
}

테스트 케이스를 넣은 코드 결과 콘솔화면

코드를 작성하면서 한 2번 정도 실수를 한 것 같다. 첫번째 실수는 새로운 패턴이 나올 때 줄바꾸기(\n)를 넣지 않은 것이고, 두번째 실수는 패턴 구현에만 신경 쓰느라 입력한 횟수만큼 패턴이 또 반복되어야 한다는 것을 잊은 것이다.

 

일단 이 문제는 처음에 별을 어떻게 구현할 지 규칙부터 찾기 시작했다. 2차원 배열로도 구현을 하면 어떨까라는 생각을 했으나 생각보다 복잡해질 것 같아서 일찌감치 접었다. 그리고 *와 공백을 번갈아서 입력한 숫자만큼 출력하는 알고리즘을 상상해보았다. 이것도 복잡했다. 그래서 떠올린 것이 '어차피 공백은 눈으로 볼 때 아무것도 출력되지 않은 것처럼 보이니까 *랑 공백을 한 세트로 묶어서 패턴을 만들면 어떨까?'였다.

 

그래서 패턴의 첫 번째줄에는 "* "이 번갈아서 나타나고, 두 번째 줄에는 " *"이 번갈아서 나타난다. 이제 번갈아서 나타나는 횟수 설정에 대한 문제가 남았는데 이렇게 패턴을 *와 공백을 합쳐놓고 보니 홀수가 입력될 때는 첫번째 줄에만 추가로 패턴이 하나 더 나타난다는 사실을 알게되었다. 그래서 입력한 숫자가 홀수인지 짝수인지 구분하여 홀수면 첫 번째 줄에 패턴을 하나 더 출력하고, 짝수면 두 줄 모두 같은 횟수만큼 패턴을 반복 출력한다.

 

...이렇게 여기까지만 생각하다가 앞서 말한 2가지 실수를 저질러버렸다. 패턴만 신경쓸 것이 아니라 두 줄의 패턴 전체가 입력한 숫자만큼 또다시 반복되어 나타나고, 다음 패턴으로 넘어갈 때 줄바꿈(\n) 처리를 하지 않아 첫 번째 콘솔 화면에서는 완전히 엉겨버린 별 찍기가 나타났었다. 다행히 정리하기 어려운 실수는 아니라 금방 해결했다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함