본문 바로가기
알고리즘 (C++)

[백준] 15886번: 내 선물을 받아줘 2

by Dev_Hugh 2023. 11. 20.
728x90
반응형

요즘... 생각이 많아 잠시 휴식 타임을ㅠㅠ 여튼 지금부터 다시 힘내보려 합니다!

 

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

 

15886번: 내 선물을 받아줘 2

욱제는 구사과의 열렬한 팬이다. 오늘 욱제는 구사과에게 선물()을 전달해주려고 한다. 지난 며칠간의 관찰 끝에 욱제는 구사과의 이동 패턴을 모두 파악했다. 구사과가 있는 곳은 1×N 크기의 직

www.acmicpc.net

이 문제를 처음 접했을 때 무슨 소리인지 이해하는데 한참 걸렸다.

구사과의 위치를 모르지 이동을 시작하는 위치와 관계없이 선물을 줘야한다. 문제에서 이동은 E와 W인 경우에 이동한다.

그렇다면 결론은 E에서 W로 바뀌는 즉 이동이 바뀌는 순간 E에 선물을 놓는다면 구사과를 무조건 얻을 수 밖에 없다.

이렇게 바뀌는 경우에만 놓는다면 최소의 경우의 수가 나오게 된다.

 

초기 map은 0으로 세팅해둔다. 그리고 지나간 길은 1로 바꾸고 이때 아직 방문하지 않았는데 'E'인 길이면 거기에 사과를 놓으니 이때 카운팅을 해준다.

#include<iostream>
#include<vector>

#define FastIO ios::sync_with_stdio(false); std::cin.tie(NULL); std::cout.tie(NULL);

using namespace std;

vector<int> map;
string sInput;

void DFS(int start)
{
	if ( map[start] == 1 )
		return;
	map[start] = 1;

	if ( sInput[start] == 'E' )
		DFS(start + 1);
	else
		DFS(start - 1);
}

int main(void)
{
	FastIO;

	int N = 0; // 골목길의 길이 N
	cin >> N;
	cin >> sInput;
	map.resize(N, 0);
	int answer = 0;
	for ( int i = 0; i < sInput.length(); i++ )
	{
		if ( map[i] != 1 && sInput[i] == 'E' )
		{
			DFS(i);
			answer++;
		}
	}

	cout << answer << "\n";
	return 0;
}
728x90
반응형