알고리즘 문제

백준 - Poziome serca (C++)

als982001 2023. 7. 21. 09:46

Pixabay로부터 입수된 Dariusz Sankowski님의 이미지 입니다.

 


 

https://www.acmicpc.net/problem/26772

 

26772번: Poziome serca

W pierwszym (jedynym) wierszu wejścia znajduje się jedna liczba naturalna N, określająca liczbę serduszek do wypisania. Liczba ta będzie równa co najmniej 1 i co najwyżej 100 000.

www.acmicpc.net

 

 이번 문제는 입력된 숫자만큼 하트를 출력하는 문제이다. 그런데 그냥 출력하는 것이 아니라 가로로(한 행으로) 출력해야 한다. 그래서 재밌어 보여 이 문제를 기록하기로 하였다. 세로로 출력해야 하는 문제라면 단순히 주어진 숫자만큼 반복문을 돌리면 끝이겠지만, 가로로 출력해야 하기에 굉장히 귀찮은 문제이다.

input: 2
 @@@   @@@   @@@   @@@ 
@   @ @   @ @   @ @   @
@    @    @ @    @    @
@         @ @         @
 @       @   @       @ 
  @     @     @     @  
   @   @       @   @   
    @ @         @ @    
     @           @     
     
input: 4
 @@@   @@@   @@@   @@@   @@@   @@@   @@@   @@@ 
@   @ @   @ @   @ @   @ @   @ @   @ @   @ @   @
@    @    @ @    @    @ @    @    @ @    @    @
@         @ @         @ @         @ @         @
 @       @   @       @   @       @   @       @ 
  @     @     @     @     @     @     @     @  
   @   @       @   @       @   @       @   @   
    @ @         @ @         @ @         @ @    
     @           @           @           @

 입력이 2와 4일 때의 출력이다. 하트의 각 행은 단순히 복사/붙여넣기를 통해 출력하면 된다. 그리고 주의해야할 점이 하나 있는데, 하트와 하트 사이에는 한 칸의 공백이 존재한다. 이를 주의하여 출력해야 한다.

 

#include <iostream>
#pragma warning(disable:4996)

using namespace std;

void Margin(int n, int N)
{
	if (n < N - 1)
		printf(" ");
}

void PrintHeart(int N)
{
	for (int n = 0; n < N; ++n)
	{
		printf(" @@@   @@@ ");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("@   @ @   @");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("@    @    @");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("@         @");	
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf(" @       @ ");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("  @     @  ");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("   @   @   ");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("    @ @    ");
		Margin(n, N);
	}
	printf("\n");

	for (int n = 0; n < N; ++n)
	{
		printf("     @     ");
		Margin(n, N);
	}
	printf("\n");
}

int main()
{
 	ios_base::sync_with_stdio(0);
	std::cout.tie(0);
	cin.tie(0);

	int N;

	scanf("%d", &N);

	PrintHeart(N);

    return 0;
}

 여기서 Margin이라는 함수를 통해 하트와 하트 사이에 간격을 하나 주었다. 그런데 Margin 함수를 보면 if (n < N - 1)이라는 조건문이 있다. 마지막 하트의 오른쪽에는 간격을 주지 않기 위해서 조건문을 이용했는데, 이는 이 문제와 비슷한 문제에서 마지막 출력에 간격을 줘서 틀렸던 경험이 있기에 혹시나 하는 마음에 추가한 것이다.