알고리즘 공부/백준

[백준] 23351번 물 주기

pa_songsong 2021. 11. 10. 10: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이 된 화분에 있는 캣닢은 죽는다.

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

입력

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

출력

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

예제

내코드

  • 첫 날짜는 1부터 시작합니다.
  • 화분 개수로 나머지 연산을 하여 증가시킬 화분을 구할 수 있습니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine()," ");
        int potCnt = Integer.parseInt(st.nextToken());
        int firstWater = Integer.parseInt(st.nextToken());
        int continuouslyCnt = Integer.parseInt(st.nextToken());
        int waterCnt = Integer.parseInt(st.nextToken());

        int pot[] = new int[potCnt];
        for(int i = 0; i<pot.length; i++){
            pot[i] = firstWater;
        }

        int dayCnt = 1;
        int today = 0;

        while(true){

            for(int i = 0; i<continuouslyCnt; i++){
                int n = (today+i) % potCnt;
                pot[n] += waterCnt;
            }

            for(int i = 0; i<potCnt; i++){
                pot[i] -= 1;
                if(pot[i] == 0){
                    System.out.println(dayCnt);
                    return;
                }
            }
            today = (today + continuouslyCnt) % potCnt;
            dayCnt++;
        }
    }
}

 

  • Arrays.fill(pot,firstWater)을 하면 물 초깃값 한번에 채울 수 있다.