베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

Coding Test/BOJ

[BOJ/JAVA] 23351번: 물주기

2022. 11. 21. 11:45

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

 

23351번: 물 주기

첫째 줄에 자연수 $N$, $K$, $A$, $B$가 공백을 사이에 두고 주어진다. ($2 \le N \le 100$, $1 \le K \le 100$, $1 \le A \times B < N$, $A$는 $N$의 약수)

www.acmicpc.net

키워드

일직선으로 놓여진 N개의 화분에 캣닢이 하나씩 심어져 있다.

각 화분은 초기에 K만큼의 수분을 머금고 있고, 매일 아래와 같은 일이 순서대로 일어난다.

  1. 랑이 집사가 연속된 A개의 화분에 물을 준다. 이 때 물을 준 화분의 수분은 B만큼씩 증가한다.
  2. 모든 화분의 수분이 1씩 감소한다.
  3. 수분이 0이 된 화분에 있는 캣닢은 죽는다.

모든 캣닢이 살아 있는 기간이 최대한 길어지도록 물을 줄 때, 첫 캣닢이 죽는 날짜를 출력하는 프로그램


구현

  • 그리디 알고리즘을 사용하여 연속된 A개의 화분의 수분 누적합이 가장 작은 구간에 물을 준다.
  • 수분이 감소하는 메소드를 구현한다.
    • 감소하는 메소드 내에서 수분이 0이 되어 있는 화분을 체크한다.
    • 수분이 0이 된다면 날짜를 반환한다.

코드

import java.util.Arrays;
import java.util.Scanner;

public class java_23351 {
    static int board[];

    static int N, K, A, B;

    // 말리기
    // true : 0인 화분 생성
    static boolean dry() {
        for (int i = 0; i < board.length; i++) {
            board[i] -= 1;
            if (board[i] == 0) {
                return true;
            }
        }
        return false;
    }

    // 최소누적합 인덱스 찾기
    static int findIndex() {
        int index = 0;

        // [0:A) 까지 합
        int minSum = 0;
        int tmpSum = 0;
        for (int i = 0; i < A; i++) {
            minSum += board[i];
        }

        //
        tmpSum = minSum;

        // 시작 인덱스는 [N-A-1:N-1) 까지
        for (int i = 0; i < N - A; i++) {
            tmpSum = tmpSum - board[i] + board[i + A];
            // System.out.println(tmpSum);
            if (tmpSum < minSum) {
                minSum = tmpSum;
                index = i + 1;
            }
        }
        return index;
    }

    // 물 주기
    static void water(int startIndex) {
        for (int i = startIndex; i < startIndex + A; i++) {
            board[i] += B;
        }
    }

    static int solution() {
        int date = 1;
        while (true) {
            // 연속된 A개의 합 중 가장 작은 시작 인덱스 출력
            int index = findIndex();
            // 물주기
            water(index);
            // 말리기
            if (dry()) {
                break;
            }

            date++;
        }

        return date;
    }

    public static void main(String[] args) {
        // 일직선 N개의 화문에 캣닢이 하나씩 심어져 있다.
        // K수문

        // 연속된 A개의 화분에 물을 준다. B만큼 수분 증가
        // 모든 수분 1씩 감소
        // 0이된 화분 죽음

        // 첫 캣닢이 죽는 날짜?

        Scanner scanner = new Scanner(System.in);

        // 화분의 크기
        N = scanner.nextInt();

        // 화분 초기화
        board = new int[N];

        // 초기 수분
        K = scanner.nextInt();
        Arrays.fill(board, K);

        // 연속된 A개의 화분에 물주기
        A = scanner.nextInt();
        // B만큼 증가
        B = scanner.nextInt();

        int result = solution();

        System.out.println(result);

        scanner.close();

    }
}

저작자표시 (새창열림)

'Coding Test > BOJ' 카테고리의 다른 글

[BOJ/JAVA] 마법사 상어와 토네이도  (0) 2022.11.21
[BOJ/JAVA] 3190번: 뱀  (0) 2022.11.21
[BOJ/JAVA] 10709번: 기상캐스터  (0) 2022.11.21
[BOJ/JAAVA] 1967번: 트리의 지름  (0) 2022.11.14
[BOJ/JAVA] 15681번: 트리와 쿼리  (1) 2022.11.14
    'Coding Test/BOJ' 카테고리의 다른 글
    • [BOJ/JAVA] 마법사 상어와 토네이도
    • [BOJ/JAVA] 3190번: 뱀
    • [BOJ/JAVA] 10709번: 기상캐스터
    • [BOJ/JAAVA] 1967번: 트리의 지름
    베오
    베오

    티스토리툴바