danbibibi
article thumbnail

문제

문제 바로가기> BOJ 16724번: 피리 부는 사나이

 

16724번: 피리 부는 사나이

첫 번째 줄에 지도의 행의 수를 나타내는 N(1 ≤ N ≤ 1,000)과 지도의 열의 수를 나타내는 M(1 ≤ M ≤ 1,000)이 주어진다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열이 주

www.acmicpc.net

 

풀이

dfs 탐색을 통해 이동을 진행하다가, 해당 턴에서 이미 방문했던 곳으로 돌아오는 경우, 

SAFE ZONE이 필요한 것이므로 ans를 1증가해주었다!

 

#include<iostream>
#include<string>
#define MAX 1001
using namespace std;

int N, M, ans=0;
char map[MAX][MAX];
int visited[MAX][MAX];

void input() {
	cin >> N >> M;
	for (int i = 0; i < N; i++) {
		string line; cin >> line;
		for (int j = 0; j < M; j++) map[i][j] = line[j];
	}
}

void dfs(int y, int x, int n) {
	visited[y][x] = n;
	
	int ny=y, nx=x;
	if (map[y][x] == 'U') ny--;
	else if (map[y][x] == 'D') ny++;
	else if (map[y][x] == 'L') nx--;
	else if (map[y][x] == 'R') nx++;
	
	if(visited[ny][nx]==0) dfs(ny, nx, n);
	else if (visited[ny][nx] == n) ans++;
}

void solution() {
	int n = 1;
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			if (visited[i][j]) continue;
			dfs(i, j, n++);
		}
	}
}

int main() {
	ios_base::sync_with_stdio(0); cin.tie(0);
	input();
	solution();
	cout << ans;
}

'문제 풀이 > 백준' 카테고리의 다른 글

BOJ 17836번: 공주님을 구해라!  (0) 2023.03.30
BOJ 1600번: 말이 되고픈 원숭이  (0) 2023.03.29
BOJ 2193번: 이친수  (0) 2023.03.28
BOJ 17404번: RGB거리 2  (0) 2023.03.23
BOJ 1766번: 문제집  (0) 2023.03.23
profile

danbibibi

@danbibibi

꿈을 꾸는 시간은 멈춰 있는 것이 아냐 두려워하지 마 멈추지 마 푸른 꿈속으로