본문 바로가기
Algorithm/Baekjoon

Baekjoon 3060 욕심쟁이 돼지 JAVA

by Hunveloper 2022. 10. 4.
728x90

 

3060번: 욕심쟁이 돼지

입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 두 줄로 구성되어 있고, 첫째 줄에는 하루에 배달되는 사

www.acmicpc.net

문제

유명한 농부 박현수는 돼지 6마리를 키우고 있다. 그는 하루에 한 번씩 돼지에게 맛있는 밥을 준다.

돼지는 원형 식탁에 앉아서 식사를 한다. 현수의 돼지들은 기억력이 뛰어나기 때문에 전 날 자신의 양쪽과 맞은편에 앉았던 돼지가 먹었던 양을 기억하고 있다. 또, 욕심도 많기 때문에, 그 만큼의 양을 추가하여 식사를 하기를 원한다.

예를 들어, 현수가 1번부터 6번까지 돼지에게 각각 3, 2, 7, 1, 5, 4만큼 밥을 주었다면, 2번 돼지는 첫 날 받은 양 2에다 양쪽과 맞은편 돼지가 받은 양 15(3+7+5)만큼을 더해 17만큼 받기를 원한다.

마음씩 좋은 농부 박현수는 이런 돼지의 요구를 모두 들어주려고 한다. 매일 현수의 집에 신선한 사료가 N만큼 배달된다. 사료의 유통기한은 하루이기 때문에, 남은 사료는 모두 폐기한다.

첫 날 돼지들이 먹었던 양이 주어졌을 때, 현수가 6마리의 돼지들의 요구를 들어줄 수 없게 되는 날이 몇 번째 날인지 구하는 프로그램을 작성하시오.

입력

입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터는 두 줄로 구성되어 있고, 첫째 줄에는 하루에 배달되는 사료의 양 N (1<=N<=500,000,000)이 주어진다. 그 다음 줄에는 1, 2, 3, 4, 5, 6번 돼지가 첫 날 먹었던 식사의 양이 빈 칸을 사이에 두고 차례대로 주어진다. 첫째 날에 각 돼지가 먹는 사료의 양은 100이하의 자연수이다.

출력

각 테스트 데이터에 대해, 6마리 돼지의 요구를 모두 들어줄 수 없게 되는 날이 몇 번째 날인지 출력한다.

풀이

돼지가 먹는 사료량을 오늘의 사료량과 내일의 사료량을 저장하도록 이차원 배열을 생성한다.

오늘의 사료량 배열에 입력받는 식사의 양을 적어놓는다.

돼지들이 첫날에 먹는 사료량을 다 더한 후 배달되는 사료량보다 많다면 오늘이 마지막이기에 종료한다.

 

2일째에는 배열을 이용하여 왼쪽에 있는 돼지 (pig[0][5-i])의 값과 오른쪽에 있는 돼지 (pig[0][(i+1)%6])을 더하고

맞은편에 있는 돼지 (pig[0][(i+3)%6])을 이용하여 내일 먹을 사료를 계산해준다.

 

그리고 하루가 끝날때 내일의 사료를 오늘의 사료로 갱신해주고 하루를 끝낸다.

코드
import java.io.*;
import java.util.*;

public class Main {
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		int T = Integer.parseInt(br.readLine());
		int[][] pig = new int[2][6];
		for (int t = 0; t < T; t++) {
			int n = Integer.parseInt(br.readLine());
			StringTokenizer st = new StringTokenizer(br.readLine());
			for (int i = 0; i < 6; i++)
				pig[0][i] = pig[1][i] = Integer.parseInt(st.nextToken());
			int sum = 0, cnt = 0;
			while (sum <= n) {
				sum = 0;
				for (int i = 0; i < 6; i++)
					sum += pig[0][i];
				for (int i = 0; i < 6; i++)
					pig[1][i] += pig[0][(i + 1) % 6] + pig[0][5 - i] + pig[0][(i + 3) % 6];
				for (int i = 0; i < 6; i++)
					pig[0][i] = pig[1][i];

				cnt++;
			}
			System.out.println(cnt);
		}
	}
}
728x90
728x90

댓글