문제링크 : https://www.acmicpc.net/problem/14248
14248번: 점프 점프
첫 번째 줄에는 돌다리의 돌 개수 n이 주어진다.(1≤n≤100,000) 돌의 번호는 왼쪽부터 1번에서 n번이다. 다음 줄에는 그 위치에서 점프할 수 있는 거리 Ai가 주어진다.(1≤Ai≤100,000) 다음 줄에는 출
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;
int N, result, s;
int arr[100001];
bool visited[100001];
void dfs(int cur)
{
if(cur<1 || cur>N) return; //범위 조건
visited[cur] = 1;
dfs(cur+arr[cur]); //앞으로
dfs(cur-arr[cur]); //뒤로
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> N;
for(int i=1; i<=N; i++) cin >> arr[i];
cin >> s;
dfs(s);
for(int i=1; i<=N; i++) if(visited[i]) result++; //방문체크
cout << result;
return 0;
}
나름 간단한 dfs 문제이다.
입력받은 시작점을 기준으로 dfs를 돌려주며, 이동하는 방향이 앞과 뒤이므로 해당 2개에 대해서 재귀를 다시 돌려준다.
앞으로 가는 것은 현재 위치 + 점프 가능 횟수, 뒤로 가는 것은 현재 위치 - 점프 가능 횟수로 값을 넣어준다.
범위조건이자 종료조건으로 현재 위치가 1보다 작거나 N을 넘어서면 종료하도록 해준다.
재귀를 도는 모든 값에 대해 방문처리를 해주고, 나중에 이 방문처리된 가짓수를 세어주면 이것이 구하고자하는 정답이다.
'백준 > 실버' 카테고리의 다른 글
[백준 25418번] 정수 a를 k로 만들기 (C++) (0) | 2023.12.12 |
---|---|
[백준 1326번] 폴짝폴짝 (C++) (0) | 2023.12.11 |
[백준 12026번] BOJ 거리 (C++) (0) | 2023.12.08 |
[백준 11568번] 민균이의 계략 (C++) (0) | 2023.12.06 |
[백준 15489번] 파스칼 삼각형 (C++) (0) | 2023.12.04 |