728x90
반응형
https://www.acmicpc.net/problem/1326
1326번: 폴짝폴짝
첫째 줄에 징검다리의 개수 N(1≤N≤10,000)이 주어지고, 이어서 각 징검다리에 쓰여 있는 N개의 정수가 주어진다. 그 다음 줄에는 N보다 작거나 같은 자연수 a, b가 주어지는 데, 이는 개구리가 a번
www.acmicpc.net
1. Logic
처음에 DP로 될거같아서 시도했는데 DP는 vis배열을 찍고 나오기 때문에 최단거리 계산이 안된다. 그리고 vis배열을 기록을 안하게 되면 루프를 계속 들어가기 때문에 힙이 터진다..ㅋㅋㅋㅋ
결국 BFS 느낌으로 해결
이 문제에서 " 징검다리에 쓰여 있는 수의 배수만큼 떨어져 있는 곳으로만 갈 수 있다."는 배수만큼 앞으로 이동 + 배수만큼 뒤로 이동할 수 있다.
2. Code
#include <bits/stdc++.h>
using namespace std;
int dist[10001];
int cnt[10001];
bool vis[10001];
int n;
int s, e;
void solve() {
queue<int> q;
q.push(s);
vis[s] = true;
while(!q.empty()) {
int cur = q.front();
q.pop();
if(cur == e) return;
for(int i = cur + dist[cur]; i <= n; i += dist[cur]) {
if(vis[i]) continue;
vis[i] = true;
cnt[i] = cnt[cur] + 1;
q.push(i);
}
for(int i = cur - dist[cur]; i >= 1; i -= dist[cur]) {
if(vis[i]) continue;
vis[i] = true;
cnt[i] = cnt[cur] + 1;
q.push(i);
}
}
}
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> dist[i];
}
cin >> s >> e;
solve();
if(cnt[e] == 0) cout << -1;
else cout << cnt[e];
}
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
728x90
반응형
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 2210 숫자판 점프 C++ :: Graph & DFS (0) | 2023.12.15 |
---|---|
[백준/Baekjoon] 1189 컴백홈 C++ :: Graph & DFS (0) | 2023.12.14 |
[백준/Baekjoon] 1525 퍼즐 C++ :: BFS & Set & Map (0) | 2023.12.12 |
[백준/Baekjoon] 4963 섬의 갯수 C++ :: BFS (0) | 2023.12.11 |
[백준/Baekjoon] 17142 연구소 3 C++ :: BFS (1) | 2023.12.11 |