1743번
1743번 - 음식물 피하기 단순히 DFS를 돌려서, 가장 많이 인접한 값을 찾는 문제. 매번 void 형 함수를 썼는데, 리턴값을 int 로 하는 연습도 할 겸 문제를 풀었다. 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263#include#includeusing namespace std; bool check[101][101];char map[101][101];int dx[4] = { 0,0,1,-1 };int dy[4] = { 1,-1,0,0 }; int n, m, k, ans;int dfs(int x, int y){ int ret = 1; ..
더보기
2617번
2617번 - 구슬 찾기 DFS 알고리즘 분류 문제로 풀었는데, 이전에 플로이드로 풀었던 문제랑 비슷했다. 만약 DFS나 BFS로 풀려면 , 한 노드당 두번씩 돌려서 작은 구슬, 큰 구슬의 갯수를 구해주면 된다. 구슬의 크기가 중간일 확률이 아예 없으려면, 큰 구술이 과반이 넘거나, 작은 구슬이 과반이 넘어야 한다. 처음에 나는 이전에 풀었던 문제와 비슷하게, 큰구슬+작은구슬이 과반이 넘어가면 정답으로 체크했는데, 이 문제에서는 틀리다. 딱 중간에 있는 구슬의 경우 큰구슬+작은구슬이 과반을 넘지만, 중간이기 때문이다. 또한 짝수든 홀수든 (n/2)+1 이 반절이 된다. 만약 1 2 3 4 네개의 구슬일 경우 2,3 모두 중간이기 때문이다. 따라서 플로이드 값을 비교하면서, small 배열과 big 배열을..
더보기
11058번
11058번 - 크리보드 이 문제에 대한 해결을 못봐서 다른 분들의 코드를 봤다. 내가 생각하기에 가장 핵심은, 점화식 D[n] = n번 눌렀을 때, 출력되는 최대값 이라고 했을 때, D[1]=1,D[2]=2,...D[6]=6 이라는 점을 알아차리는 것이다. 이 점을 알아차린다는 것은 결국 N이 7이상일 때 2,3,4 번만을 작동해야 한다는 것을 깨닫는 것과 같다. 따라서 기저 조건으로 N이 1~6까지만 알아낸다면 그 다음은 쉽게 풀 수 있다. N자리 일때, 맨 마지막이 ACV 인 경우, ACVV인 경우, ACVVV인 경우로 나누면 된다. ACVVVV 는 결국 ACVACV 보다 작게 되기 때문에 3가지 경우만으로 계산을 수행하면 된다. 따라서 1. ACV 인 경우, D[N-3]의 2배 값을 갖게 된다.(..
더보기