티스토리 뷰

728x90
반응형

백준 온라인 저지(BOJ) 2444번 별 찍기 - 7
https://www.acmicpc.net/problem/2444

 

2444번: 별 찍기 - 7

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

www.acmicpc.net

* 사용언어 : C언어, C++

 

1. 문제

N 을 입력받아 출력과 같은 마름모 형태로 별(*)을 출력

 

2. 풀이

기타를 처음 배우면 C코드에서 한 번, F코드에서 한 번 고비가 옵니다.
거기서 많은 사람들이 포기하는데 그 고비를 넘고나면 이후 과정은 생각보다 어렵지 않습니다.

코딩에서의 별 찍기 문제가 기타에서의 C코드나 F코드 같은 고비가 아닐까 싶습니다.


2차원 map 과 이를 구현하는 2중 for 문이 익숙한 상태라면 쉬운 문제이지만,
초심자에게는 코딩을 포기하고 싶게 만드는 어려운 문제라고 할 수 있습니다.

문제를 풀려면 먼저 2중 for 문에 대해 이해를 해야합니다.
(0부터 사용하는 것이 맞으나 설명하기 쉽게 모든 index 는 1부터 사용했습니다)

바깥 쪽 for 문의 index(i) 는 y축, 각 줄을 의미한다고 볼 수 있습니다.
i 가 1이면 첫 번째 줄, 2면 두 번째 줄, ... n 이면 n 번째 줄입니다.

안 쪽 for 문의 index(j) 는 x축, 해당 줄의 한 칸을 의미한다고 볼 수 있습니다.
j 가 1이면 첫 번째 글자, 2면 두 번째 글자, ... n 이면 n 번째 글자입니다.

설명한 i 와 j 를 문제의 예시 출력(n = 5인 경우)으로 표현하면 아래와 같습니다.
 

2차원 map 표현 시 i, j 보다는 y, x 로 표현하는 경우가 더 많습니다

 
이제 각 줄 별로 '공백' 과 '별' 을 개별로 나누어 생각합니다.
공백이 1번 줄에 4개, 2번 줄에 3개, ... 
별이 1번 줄에 1개, 2번 줄에 3개, ...

공백과 별을 따로 나눈 뒤 규칙을 생각해내면 되는데,
고등 수학에서 등차수열의 일반항을 찾는 원리와 비슷합니다.
각 줄마다 일반항만큼 j 개의 '공백' or '별' 을 찍게 하면 됩니다.
(일반항을 찾는 과정은 풀이로 굳이 작성하지 않고 코드로 대체하겠습니다)

추가로 i 가 5인 시점을 기준으로 규칙이 반전되므로,
for 문을 ① i 를 1 부터 5(n) 까지, ② 6(n + 1) 부터 9(2 * n - 1)까지 2 덩어리로 나누어 작성하였습니다.

 

3. 코드

#ifndef _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_WARNINGS
#endif
/*
2444_별 찍기 - 7
1116kb	0ms
*/
#include <cstdio>

int main() {
#ifdef _WIN32
	freopen("input.txt", "r", stdin);
#endif // _WIN32
	int n;
	scanf("%d", &n);

	int i, j;
	for (i = 1; i <= n; ++i) {
		for (j = 1; j <= n - i; ++j) printf(" ");
		for (j = 1; j < 2 * i; ++j) printf("*");
		puts("");
	}
	for (i = n + 1; i < n * 2; ++i) {
		for (j = n; j < i; ++j) printf(" ");
		for (j = 1; j < 2 * (2 * n - i); ++j) printf("*");
		puts("");
	}
	return 0;
}

* puts("") 는 printf("\n") 과 같은 역할입니다.

728x90
반응형
댓글