dev_beomgeun
꾸준하게 차근차근
dev_beomgeun
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • 전공 (0)
      • 운영체제 (0)
      • 알고리즘 (0)
      • 자료구조 (0)
      • 데이터베이스 (0)
      • 네트워크 (0)
    • 개발 공부 (32)
      • 웹 (6)
      • 리눅스 (4)
      • 머신러닝 (1)
      • 스프링 (17)
      • Git (2)
      • AWS (2)
    • 개발 도서, 강의 (3)
      • 스프링 입문을 위한 자바 객체지향의 원리와 이해 (0)
      • 모든 개발자를 위한 HTTP 웹 기본 지식(김영한.. (2)
      • 스프링 부트와 AWS로 혼자 구현하는 웹서비스 (1)
    • 문제 풀이 (118)
      • 백준 알고리즘 (72)
      • 프로그래머스 알고리즘, SQL (38)
      • Hackerrank SQL (8)
    • 프로젝트 기록 (4)
      • 캡스톤 종합설계 (4)
      • 반려하루 프로젝트 (0)
    • 활동 기록 (12)
      • 네이버 부스트캠프 (7)
      • 취준 & 코테 (4)
      • 소프트웨어 마에스트로 13기 (1)
    • 이것저것 (1)

블로그 메뉴

  • 홈
  • 깃허브
  • 링크드인
  • 방명록

공지사항

인기 글

태그

  • HackerRank mysql
  • BFS
  • 서블릿
  • 백준
  • 그래프탐색
  • 부스트캠프
  • 반성
  • 프로그래머스 SQL
  • dp
  • c++
  • 일기
  • 프로그래머스
  • Hackerrank
  • 스프링
  • 네이버 부스트캠프
  • 백준 DP
  • AI Tech
  • Baekjoon
  • 회고
  • 기록

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev_beomgeun

꾸준하게 차근차근

문제 풀이/백준 알고리즘

[baekjoon 1326] 폴짝폴짝 (BFS) (C++)

2021. 2. 13. 23:13
728x90

www.acmicpc.net/problem/1326

 

1326번: 폴짝폴짝

첫째 줄에 징검다리의 개수 N(1≤N≤10,000)이 주어지고, 이어서 각 징검다리에 쓰여 있는 N개의 정수가 주어진다. 그 다음 줄에는 N보다 작거나 같은 자연수 a, b가 주어지는 데, 이는 개구리가 a번

www.acmicpc.net

문제는 개구리가 징검다리를 뛰어다니는데, 그 징검다리에는 각각 숫자가 써져있고 개구리는 자신이 서있는 징검다리의 숫자의 배수만큼 점프할 수 있다.

즉, 10개의 징검다리에서 1 2 3 4 5 6 7 8 9 1 이 써져있고 2번에서 9번까지 가고 싶다면

처음 징검다리 2번의 경우 : 2가 써져있으므로 2의 배수인 4 6 8 10을 각각 한 번의 점프로 방문이 가능하다.

그 이후 10의 경우 : 1이 써져있으므로 앞 또는 뒤로 1의 배수만큼 움직일 수 있다. 즉, 방문하지 않은 9 7 5 3 1을 각각 한 번의 점프로 방문이 가능하다.

따라서 2번에서 9번은 2 -> 10 -> 9로 총 두 번만에 방문이 가능하다.

 

처음에 뒤로 점프하는 경우는 생각하지 않아서 틀렸다.

 

최소 몇 번 점프를 해서 목적지에 도착할 수 있는가를 물어보기에 최단 거리를 찾는 BFS를 이용했다.

BFS를 수행해주면서 방문한 곳에 더 최단거리로 도착할 수 있는 경우의 수가 있지 않을까 생각을 했지만

나중에 그런 경우를 찾아서 방문한다는 것은 이미 전에 방문했던 수보다 업데이트되어서 방문했을 것이다. 즉, 제일 먼저 방문해서 체크하는 경우가 가장 최소다.

 

나머지는 기본 BFS 풀듯이 방문 체크해주면서 각각 배수만큼 탐색해주면 된다.

 

#include <iostream>
#include <queue>

using namespace std;

int N, num, from, to, road[10001], check[10001], record[10001];

void BFS(int from, int to) {
	queue<int> q;
	q.push(from);
	check[from] = true;

	while (!q.empty()) {
		int temp = q.front();
		q.pop();

		if (temp == to) {
			return;
		}

		for (int i = temp + road[temp]; i <= N; i += road[temp]) {
			if (!check[i]) {
				record[i] = record[temp] + 1;
				q.push(i);
				check[i] = true;
			}
		}
		for (int i = temp - road[temp]; i >=1; i -= road[temp]) {
			if (!check[i]) {
				record[i] = record[temp] + 1;
				q.push(i);
				check[i] = true;
			}
		}
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin >> N;
	for (int i = 1; i <= N; i++) {
		cin >> road[i];
	}
	cin >> from >> to;
	if (from == to) {
		cout << "0";
		return 0;
	}
	BFS(from, to);

	if (record[to] == 0) {
		cout << -1;
	}
	else
		cout << record[to];
}
728x90
저작자표시 비영리 변경금지 (새창열림)

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

[baekjoon 1149] RGB거리 (DP) (C++)  (0) 2021.02.16
[baekjoon 1806] 부분합 (투 포인터) (C++)  (0) 2021.02.15
[baekjoon 2447] 별 찍기 - 10 (재귀 호출) (C++)  (0) 2021.02.09
[baekjoon 11729] 하노이의 탑 이동 순서 (재귀 호출) (C++)  (0) 2021.02.09
[baekjoon 2146] 다리 만들기 (그래프, BFS) (C++)  (0) 2021.02.08
    '문제 풀이/백준 알고리즘' 카테고리의 다른 글
    • [baekjoon 1149] RGB거리 (DP) (C++)
    • [baekjoon 1806] 부분합 (투 포인터) (C++)
    • [baekjoon 2447] 별 찍기 - 10 (재귀 호출) (C++)
    • [baekjoon 11729] 하노이의 탑 이동 순서 (재귀 호출) (C++)
    dev_beomgeun
    dev_beomgeun
    백엔드 개발을 하며 얻은 지식과 경험을 공유합니다. 현재 카카오페이에서 백엔드 엔지니어로 일하고 있습니다.

    티스토리툴바