문제 출처
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. 소감
- 스킬 필요없이, 정말 단순한 구현이었다.
- 문제를 풀기 전에 문제 힌트를 보지 않는데, 역시 단순 구현 문제였다.