문제 출처

1. 문제설명


  • 쿠키의 신체는 머리, 심장, 허리, 그리고 좌우 팔, 다리로 구성되어 있다.
  • 머리는 심장 바로 위칸에 있다.
  • 왼쪽 팔은 심장 바로 왼쪽, 오른쪽 팔은 바로 오른쪽에 붙어있고 그 방향으로 뻗어있다.
  • 허리는 심장의 바로 아래에 아래쪽으로 뻗어있다.
  • 좌/우 다리는 허리 각각 왼쪽, 오른쪽으로 아래로 뻗어있다.
  • 신체 부위들은 절대로 끊겨있찌 않으며 굽혀진 곳도 없다.
  • 허리, 팔, 다리의 길이는 1 이상이며, 너비는 무조건 1이다.



2. 알고리즘 설계


  • 머리는 문자열의 가장 첫 번째 만나는 *이다.
  • 심장은 머리 바로 아래 지점이다.
  • 심장부터 좌측 마지막 *까지는 왼팔, 반대쪽 마지막 *까지는 오른팔이다.
  • 허리는 심장 바로 아래 있다.
  • 허리 아래 칸의 한 칸 바로 옆 좌측은 왼쪽 다리 시작점, 우측은 오른쪽 다리 시작점이다.



3. 로직


  • 머리, 심장, 허리 좌표를 구하고, 각각에 대해 for문으로 카운팅 해주면 된다!



4. 전체 코드


#include<bits/stdc++.h>
using namespace std;

const int SZ = 1000;
char body[SZ][SZ];

int main(void)
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);

	int n; cin >> n;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < n; j++)
			cin >> body[i][j];

	pair<int, int> heart, leg_center;
	int i, j, left_arm=0, right_arm=0, mid=0, left_leg=0, right_leg=0;
	
	bool flag = true;
	for (i = 0; i < n && flag; i++) {
		for (j = 0; j < n; j++)
			if (body[i][j] == '*') {
				flag = false;
				break;
			}
	}
	heart = { i, j };

	for (i = heart.second - 1; i >= 0; i--) {
		if (body[heart.first][i] != '*') break;
		left_arm++;
	}
	for (i = heart.second + 1; i < n; i++) {
		if (body[heart.first][i] != '*') break;
		right_arm++;
	}

	for (i = heart.first + 1; i < n; i++) {
		if (body[i][heart.second] != '*') break;
		mid++;
	}

	for (j = i; j < n; j++) {
		if (body[j][heart.second - 1] != '*') break;
		left_leg++;
	}

	for (j = i; j < n; j++) {
		if (body[j][heart.second + 1] != '*') break;
		right_leg++;
	}

	cout << heart.first + 1 << ' ' << heart.second + 1 << '\n';
	cout << left_arm << ' ' << right_arm << ' ' << mid << ' ' << left_leg << ' ' << right_leg;
	return 0;
}



5. 소감


  • 스킬 필요없이, 정말 단순한 구현이었다.
  • 문제를 풀기 전에 문제 힌트를 보지 않는데, 역시 단순 구현 문제였다.