슈뢰딩거의 고등어

[백준] 16924 십자가 찾기 본문

알고리즘

[백준] 16924 십자가 찾기

슈뢰딩거의 고등어 2022. 1. 20. 01:43

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

 

16924번: 십자가 찾기

십자가는 가운데에 '*'가 있고, 상하좌우 방향으로 모두 같은 길이의 '*'가 있는 모양이다. 십자가의 크기는 가운데를 중심으로 상하좌우 방향으로 있는 '*'의 개수이다. 십자가의 크기는 1보다 크

www.acmicpc.net

 

시뮬레이션 문제이다.

 

1. 맵에서 현재탐색 위치인 (y, x)가 * 이라고 할때, (y, x-1) 과 (y, x+1) 도 * 인 블록을 찾는다.

2. (y, x)를 기준으로 하는 십자가를 생성할 수 있는 지 확인하고 가능하다면 visit 배열에 십자가를 표시한다.

3. 십자가의 크기와 y, x 를 벡터에 넣어준다.

4. 맵의 모든 블록을 1~3 의 과정으로 탐색해준다.

5. visit 배열과 맵을 비교하여 일치하는 지 확인한다.

6. 일치하지 않는다면 -1 리턴

7. 일치한다면 십자가의 갯수와 십자가 정보를 리턴해준다.

 

여기서 시간이 오래걸렸던 이유는

1) 십자가 크기 조건을 잘못 이해했음.

2) 십자가 크기를 먼저 서칭한 후, visit 에 표시할 것.

이 두 문제로 실패 시도를 많이했음...ㅠㅜㅜ

#include <iostream>
#include <vector>
using namespace std;
char map[101][101];
int n, m;
bool visit[101][101];
struct A
{
int x, y, s;	
};

int check(int y, int x) {
	int i=0;
	while(true) {
		i++;
		if(map[y-i][x] == '*' && map[y+i][x] == '*' 
			&& map[y][x+i] == '*' && map[y][x-i] == '*') {
			visit[y-i][x] = true;
			visit[y+i][x] = true;
			visit[y][x+i] = true;
			visit[y][x-i] = true;
		}

		else {
			i--;
			break;
		}
	}

	if(i != 0) {
		for(int j=0; j<i; j++) {
			visit[y-j][x] = true;
			visit[y+j][x] = true;
			visit[y][x-j] = true;
			visit[y][x+j] = true;
		}
		return i; 
	}
	return 0;
}

int main() {

	vector <A> v;
	scanf("%d %d", &n, &m);

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

	for(int i=0; i<n; i++) {
		for(int j=1; j<m-1; j++){
			if(map[i][j-1] == '*' && map[i][j] == '*'&& map[i][j+1] == '*'){
				int sizes = check(i, j);
				if(sizes > 0){
					A a;
					a.y = i+1;
					a.x = j+1;
					a.s = sizes;
					v.push_back(a);
				}
			}
		}
	}

	for(int i=0; i<n; i++)
		for(int j=0; j<m; j++){
			if((visit[i][j] == true && map[i][j] == '.') ||(visit[i][j] == false && map[i][j] == '*')) {
				printf("-1\n");
				exit(0);
			}
		}



	printf("%lu\n", v.size());
	for(int i=0; i<v.size(); i++)
		printf("%d %d %d\n", v[i].y, v[i].x, v[i].s);
	return 0;
}

'알고리즘' 카테고리의 다른 글

진수 변환  (0) 2022.01.20
[백준] 16936 나3곱2  (0) 2022.01.20
[백준] 16917 양념 반 후라이드 반  (0) 2022.01.19
[백준] 16968 차량번호판 (c++)  (0) 2022.01.19
[백준] 1074 Z 분할정복  (0) 2022.01.19
Comments