[백준] 15748 Rest Stops - Java

2024. 1. 24. 15:22· Algorithm/백준 문제풀이
목차
  1. 문제 출저
  2. 문제 풀이
  3. 소스 코드

 

 

 

문제 출저

https://www.acmicpc.net/problem/15748

 

15748번: Rest Stops

The first line of input contains four integers: $L$, $N$, $r_F$, and $r_B$. The next $N$ lines describe the rest stops. For each $i$ between $1$ and $N$, the $i+1$-st line contains two integers $x_i$ and $c_i$, describing the position of the $i$-th rest st

www.acmicpc.net

 

 

 

문제 풀이

이번 문제는 영어라 구글 번역기와 블로그를 보고 문제를 파악했습니다.

문제에는 농부 존과 그의 친구 개 배시가 길이 L의 산을 하이킹 합니다.

n개의 쉬는 지점과 존이 1미터 가는데 걸린 시간, 배시가 1미터 가는데 걸린 시간이 주어집니다.

n개의 쉬는 지점과 쉴 때 얻을 수 있는 풀의 양이 주어집니다.

 

배시는 존 보다 빠르며 존에게 뒤처지면 안됩니다. 

존은 계속해서 하이킹을 하고 배시는 쉬는 지점에서 쉴 수 있습니다. 

이 때, 배시는 쉬면서 풀을 얻을 수 있습니다.

하이킹이 끝났을 때, 배시가 얻을 수 있는 최대 풀의 양을 구해야 합니다. 

 

 

이 문제는 그리디 문제로 가장 많은 풀을 얻을 수 있는 곳을 먼저 가는 곳으로 로직을 구현했습니다.

가장 많은 풀을 얻을 수 있는 곳으로가 풀을 얻고 파머가 오면 다음 장소로 가 풀을 얻습니다. 이 과정을 반복합니다.

 

얻을 수 있는 풀의 양은 (머물 수 있는 시간 * 시간 당 얻을 수 있는 풀의 양) 입니다.

머물 수 있는 시간은 먼저 (풀을 얻을 수 있는 지점 - 현재 지점)을 통해 이동 거리를 구합니다.

그 다음 (이동 거리 * 파머의 1미터 가는데 걸리는 시간) - (이동 거리 * 배스의 1미터 가는데 걸리는 시간) 구하면 머물 수 있는 시간입니다. 

 

쉬는 지점을 풀의 양을 기준으로 내림차순 합니다. 

많이 얻을 수 있는 곳에서부터 얻을 수 있는 풀의 양을 구합니다.

만약 다음 탐색 지점이 현재 탐색 지점 보다 전이면 생략을 합니다. 

 

 

소스 코드


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.StringTokenizer;


/*
Rest Stops
https://www.acmicpc.net/problem/15748

농부 파머와 개 배시가 하이킹을 한다.
배시가 파머보다 빠르고 파머보다 뒤처지면 안된다.
쉬는 장소와 거기서 쉬었을 때 획득할 수 있는 풀의 정보가 주어진다.
즉, 배시는 파머를 기다리면서 풀을 획득할 수가 있다.
하이킹을 완료했을 때 배시가 얻을 수 있는 최대 풀을 구해야 한다.

가장 많이 풀을 얻을 수 있는 곳으로 간다.
파머가 오면 다음 가장 풀을 많이 얻을 수 있는 곳으로 간다.
이 작업을 반복한다.

얻을 수 있는 풀의 양은 (시간 당 얻을 수 있는 풀의 양 * 머물 수 있는 시간) 이다.
머물 수 있는 시간은 먼저 (풀을 얻을 수 있는 지점 - 현재 지점)을 구해 이동 거리를 구한다.
파머의 1미터 가는데 걸린 시간 * 이동 거리 - 배스의 1미터 가는데 걸린 시간 * 이동 거리를 구하면
머물 수 있는 시간을 구할 수 있다.

 */

public class Main {

  static long l, n, f, b;

  public static void main(String[] args) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer st = new StringTokenizer(br.readLine());
    l = Integer.parseInt(st.nextToken());
    n = Integer.parseInt(st.nextToken());
    f = Integer.parseInt(st.nextToken());
    b = Integer.parseInt(st.nextToken());


    List<Stop> stops = new ArrayList<>();

    for(int i = 0; i < n; i++) {
      st = new StringTokenizer(br.readLine());
      long spot = Long.parseLong(st.nextToken());
      long grass = Long.parseLong(st.nextToken());
      stops.add(new Stop(spot, grass));
    }

    long nowSpot = 0;
    Collections.sort(stops);

    long answer = 0;
    for(Stop stop : stops) {

      if(stop.spot < nowSpot) {
        continue;
      }

      long guri = stop.spot - nowSpot;
      answer += (guri * f - guri * b) * stop.grass;
      nowSpot = stop.spot;
    }

    System.out.println(answer);



  }

  public static class Stop implements Comparable<Stop> {
    long spot;
    long grass;

    Stop(long spot, long grass) {
      this.spot = spot;
      this.grass = grass;
    }

    // 내림차순으로 정렬
    public int compareTo(Stop s) {
      return (int) (s.grass - this.grass);
    }
  }

}

 

 

  1. 문제 출저
  2. 문제 풀이
  3. 소스 코드
'Algorithm/백준 문제풀이' 카테고리의 다른 글
  • [백준] 1700 멀티탭 스케줄링 - Java
  • [백준] 16434 드래곤 앤 던전 - Java
  • [백준] 1245 농장 관리 - Java
  • [백준] 1918 후위 표기식 - Java
너지살
너지살
너지살
너지살개발자
너지살
전체
오늘
어제
  • 분류 전체보기 (375)
    • 잡식 (2)
      • 티스토리 (2)
    • 개발 일지 (0)
      • OMS 프로젝트 (4)
      • 우테코 6기 프리코스 (1)
    • Git (2)
    • JAVA (15)
      • Java 공부 (6)
      • 자료구조 (4)
      • 도움되는 메모 (4)
    • DevOps (18)
      • AWS (6)
      • Docker (2)
      • Jenkins (1)
      • Nginx (1)
      • Kafka (6)
      • RabbitMQ (2)
    • Spring, Spring Boot (16)
      • Test Code (1)
      • AOP (2)
      • Batch (3)
      • Cache - Redis (5)
      • Cloud Config - 설정 파일 관리 (3)
      • 성능 측정 (1)
      • 예외 처리 (1)
    • BackEnd (1)
      • Spring 공부 (1)
      • Thymeleaft (0)
    • DB (17)
      • JPA (2)
      • DB 공부 (3)
      • DB 포스팅 (4)
      • DB 답장 (1)
      • MySQL (2)
      • Redis (5)
      • MongoDB (0)
    • CS (8)
      • Spring (4)
      • DataBase (3)
      • Java (1)
    • Algorithm (203)
      • 알고리즘 개념 (5)
      • 정렬 알고리즘 (11)
      • 프로그래머스 문제풀이 (18)
      • 백준 문제풀이 (165)
      • 소프티어 문제풀이 (3)
      • 알고리즘 시험 정리 (1)
    • SQL (0)
      • 문법 (1)
      • 프로그래머스 문제풀이 (52)
      • 리트코드 문제풀이 (19)
    • IT (1)
      • IT 공부 (1)
    • 정리 (10)
      • 질문 정리 (10)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • DP
  • dynamic programing
  • 최소 신장 트리
  • 분리 집합
  • Next permutation
  • Sorting algorithm
  • docker
  • Union-Find
  • 크루스칼 알고리즘
  • 유니온파인드
  • 두 포인터
  • 백준
  • Spring Batch
  • 다이나믹프로그래밍
  • 투 포인터
  • MST
  • Algorithm
  • Java
  • 다음 순열 찾기
  • 최소 스패닝 트리
  • DFS
  • 질문 정리
  • 외판원 순회 문제
  • 병렬 처리
  • 다이나믹 프로그래밍
  • Spring Boot
  • Java 정리
  • dynamiceprogramming
  • 우선수위큐
  • 비트마스킹
  • 투포인트
  • Spring Boot Redis 연결
  • 그래프 탐색
  • 부분탐색
  • 깊이/너비 우선탐색
  • git
  • Test code
  • 경로표현식
  • 자료구조
  • cache
  • 소프티어
  • Bitmast
  • JPA
  • 그래프 이론
  • two pointer
  • db
  • 설정
  • 알고리즘
  • 데이터베이스
  • redis

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
너지살
[백준] 15748 Rest Stops - Java
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.