[BOJ] 1326번: 폴짝폴짝

2023. 3. 3. 21:56·Problem Solving/Baekjoon

출처 : https://www.acmicpc.net/problem/1326

 

1326번: 폴짝폴짝

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

www.acmicpc.net

 

 

1. 문제 설명 

개구리는 일렬로 놓여 있는 징검다리를 건넌다. 각 징검다리에는 숫자가 쓰여 있고 쓰여진 수의 배수만큼 떨어져 있는 곳으로만 이동할 수 있다. 

 

 

 


2. 접근 방식 

양수 배수 방향으로만 가는 조건을 고려해서 시간을 많이 썼다. 징검다리에는 양수의 배수 방향과 음수의 배수 방향 둘 다 올 수 있다는 점을 고려해야 한다. DFS가 아닌 BFS를 활용하는 이유는 q에 이동할 수 있는 곳의 징검다리를 넣어줘야 한다. 만약 DFS로 돌린다면 1번만에 갈 수 있는 거리를 더 많은 점프로 갈지도 모른다.

 

 

 


3. 주석 달기 (변수 설명, 각 줄마다 문장으로 설명, 함수 설명)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static int N, a, b;
    static int[] visit;
    static int[] arr;
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer st;

    static void input() throws IOException {
        N = Integer.parseInt(br.readLine());

        visit = new int[N];
        Arrays.fill(visit, -1);
        arr = new int[N];

        st = new StringTokenizer(br.readLine());
        for(int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        st = new StringTokenizer(br.readLine());
        a = Integer.parseInt(st.nextToken()); b = Integer.parseInt(st.nextToken());

    }
    static int rec_func() {
        Queue<Integer> q = new LinkedList<>();
        q.add(a-1);
        visit[a-1] = 0;
        while (!q.isEmpty()) {
            int x = q.poll();
            for(int i = x; i < N; i += arr[x]) {
                if (visit[i] == -1) {
                    q.add(i);
                    visit[i] = visit[x] + 1;
                    if(i == b-1) return visit[i];
                }
            }
            for(int i = x; i >= 0; i -= arr[x]) {
                if (visit[i] == -1) {
                    q.add(i);
                    visit[i] = visit[x] + 1;
                    if(i == b-1) return visit[i];
                }
            }
        }
        return -1;

    }
    public static void main(String[] args) throws IOException{
        input();
        int ans = rec_func();
        System.out.println(ans);
    }
}

 


4. 분석 및 시간복잡도 

시간복잡도 : O(V+E)

 

'Problem Solving/Baekjoon' 카테고리의 다른 글
  • [BOJ] 14926번: Not Equal
  • [BOJ] 1753번: 최단경로
  • [BOJ] 9375번: 패션왕 신해빈
  • [BOJ] 14500번: 테트로미노
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    삼성기출
    도커
    docker image
    인덱스 시그니처
    interface
    PrefixSum
    오블완
    docker
    인덱서블 타입
    CORS
    백준
    S3
    알고리즘
    구간합
    컨테이너
    누적합
    세그먼트 트리
    segment tree
    AWS
    점 업데이트
    imos법
    인터페이스
    오프라인 쿼리
    티스토리챌린지
    TypeScript
    구간 업데이트
    Bucket
    python
    온라인 쿼리
    타입스크립트
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[BOJ] 1326번: 폴짝폴짝
상단으로

티스토리툴바