by CodeJin19
3 min read

Categories

Tags

오늘의 문제는 “3054번 피터팬 프레임”.

영어 문자열을 입력받으면 각 알파벳을 #이나 *을 이용해서 다이아몬드 모양으로 감싸서 출력하면 된다.

예를 들어 DOG를 입력받으면

..#…#….. .#.#.#.#... #.D.#.O..G.* .#.#.#.#... ..#…#…*..

를 출력하면 된다.

처음에는 멋있는 코드를 완성하려다가 그냥 노가다 구현을 하기로 했다.

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string arr;
	int x, y;

	cin >> arr;
	
	//1번줄
	x = 0;
	cout << ".";
	
	for (int i = 1; i <= 4 * arr.size(); i++)
	{
		if (i % 4 == 2)
		{
			x++;

			if (x % 3 == 0)
			{
				cout << "*";
			}
			else
			{
				cout << "#";
			}
		}
		else
		{
			cout << ".";
		}
	}
	
	cout << endl;

	//2번줄
	cout << ".";

	for (int i = 0; i < 2 * arr.size(); i++)
	{
		switch ((i / 2) % 3)
		{
		case 0:
		case 1:
			cout << "#.";
			break;
		case 2:
			cout << "*.";
			break;
		}
	}

	cout << endl;

	//3번줄
	cout << "#";

	for (int i = 1; i <= arr.size(); i++)
	{
		switch (i % 3)
		{
		case 1:
			cout << "." << arr[i - 1] << ".#";
			break;
		case 2:
			cout << "." << arr[i - 1] << ".*";
			break;
		case 0:
			cout << "." << arr[i - 1] << ".*";
			break;
		}
	}

	cout << endl;

	//4번줄
	cout << ".";

	for (int i = 0; i < 2 * arr.size(); i++)
	{
		switch ((i / 2) % 3)
		{
		case 0:
		case 1:
			cout << "#.";
			break;
		case 2:
			cout << "*.";
			break;
		}
	}

	cout << endl;

	//5번줄
	x = 0;
	cout << ".";

	for (int i = 1; i <= 4 * arr.size(); i++)
	{
		if (i % 4 == 2)
		{
			x++;

			if (x % 3 == 0)
			{
				cout << "*";
			}
			else
			{
				cout << "#";
			}
		}
		else
		{
			cout << ".";
		}
	}

	cout << endl;

	return 0;
}

주어진 예시는 맞췄는데 틀렸다고 한다.

그래서 DOG를 조금 변형해서 테스트 케이스를 돌려본 결과

문자열이 두 글자일때 잘못 작동한다는 것을 알았다.

DO를 입력하면

..#…#.. .#.#.#.#. #.D.#.O.# .#.#.#.#. ..#…#..

를 출력해야 하는데

..#…#.. .#.#.#.#. #.D.#.O.* .#.#.#.#. ..#…#..

를 출력하게 만들었다.

그래서 3번째 줄에 조건문을 달았다.

#include <iostream>
#include <string>

using namespace std;

int main()
{
	string arr;
	int x, y;

	cin >> arr;
	
	//1번줄
	x = 0;
	cout << ".";
	
	for (int i = 1; i <= 4 * arr.size(); i++)
	{
		if (i % 4 == 2)
		{
			x++;

			if (x % 3 == 0)
			{
				cout << "*";
			}
			else
			{
				cout << "#";
			}
		}
		else
		{
			cout << ".";
		}
	}
	
	cout << endl;

	//2번줄
	cout << ".";

	for (int i = 0; i < 2 * arr.size(); i++)
	{
		switch ((i / 2) % 3)
		{
		case 0:
		case 1:
			cout << "#.";
			break;
		case 2:
			cout << "*.";
			break;
		}
	}

	cout << endl;

	//3번줄
	cout << "#";

	for (int i = 1; i <= arr.size(); i++)
	{
		switch (i % 3)
		{
		case 1:
			cout << "." << arr[i - 1] << ".#";
			break;
		case 2:
			if (arr.size() == i)
			{
				cout << "." << arr[i - 1] << ".#";
			}
			else
			{
				cout << "." << arr[i - 1] << ".*";
			}
			break;
		case 0:
			cout << "." << arr[i - 1] << ".*";
			break;
		}
	}

	cout << endl;

	//4번줄
	cout << ".";

	for (int i = 0; i < 2 * arr.size(); i++)
	{
		switch ((i / 2) % 3)
		{
		case 0:
		case 1:
			cout << "#.";
			break;
		case 2:
			cout << "*.";
			break;
		}
	}

	cout << endl;

	//5번줄
	x = 0;
	cout << ".";

	for (int i = 1; i <= 4 * arr.size(); i++)
	{
		if (i % 4 == 2)
		{
			x++;

			if (x % 3 == 0)
			{
				cout << "*";
			}
			else
			{
				cout << "#";
			}
		}
		else
		{
			cout << ".";
		}
	}

	cout << endl;

	return 0;
}