Search
Duplicate
🙆🏻‍♀️

십자가 찾기

주차
16
문제번호
16924
언어
티어
실버
유형
구현
nj_Blog
nj_상태
이해도
풀이
사람
이해도 2
13 more properties

메모리

시간

5148 KB
52 ms

Code

#include <cstdio> #include <vector> #include <iostream> using namespace std; char map[100][100]; int cross[100][100]; int result = 0; vector <int> vec; int ai[5] = {0, 1, -1, 0, 0}; int aj[5] = {0, 0, 0, 1, -1}; void check_cross(int i, int j, int n, int m) { int c = 1; // 네 방향이 map 범위 안에 있고 *일때 십자가 카운트 및 좌표 저장. while (i - c >= 0 && i + c < n && j - c >= 0 && j + c < m) { if (map[i - c][j] == '*' && map[i + c][j] == '*' && map[i][j + c] == '*' && map[i][j - c] == '*') { result++; for (int z = 0; z < 5; z++) cross[i + ai[z] * c][j + aj[z] * c] = 1; vec.push_back(i + 1); vec.push_back(j + 1); vec.push_back(c); c++; } else break; } } int main(int argc, char const *argv[]) { int n,m; cin >> n; cin >> m; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) cin >> map[i][j]; } for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (map[i][j] == '*') check_cross(i, j, n, m); } } //십자가에 포함되지 못한 *이 있을 시 -1출력 종료 for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { if (map[i][j] == '*' && cross[i][j] != 1) { printf("%d", -1); return 0; } } } int z = 0; printf("%d\n", result); for (int i = 0; i < result; i++) { for (int j = 0; j < 3; j++) { printf("%d ", vec[z]); z++; } printf("\n"); } return 0; }
C++
복사

문제 풀이

문제는 주어진 맵에서 십자가를 찾아서 갯수와 좌표를 출력하는 문제이다 .이 빈칸 *이 십자가가 될 수 있는 문자이다.
십자가는 중복으로 카운트될 수 있고 십자가 모양이 없거나 십자가로 사용되지 않는 *이 있으면 -1을 출력한다.
우선 십자가가 될 수 있는 필수 조건으로 현재 좌표와 사방이 *일때를 찾아 한칸씩 네 방향으로 찾아가면서 카운트를 하였고 십자가로 확정(?)이 된 칸은 cross 배열에 1로 표시해주었다.
모든 맵을 체크하고 다시 모든 인덱스를 체크하면서 만약 map 배열이 *이고 cross 배열이 0이라면 -1로 종료하였다.