[BOJ/백준] 16785번 : ソーシャルゲーム (Social Game) (Java)
📘 백준 16785번 : ソーシャルゲーム (Social Game)
💡 문제 풀이
이 문제는 반복문 없이도 수학적인 계산만으로 최소 로그인 횟수를 구할 수 있음.
7일 연속 로그인하면 얻는 총 코인 수는
7A + B
.7A + B
를 얻는 날이 며칠인지 구함.전체 코인
C
를 채우기 위해 몇 주를 로그인하고, 남은 코인은 얼마인지 구함.
두 가지 경우 중 더 적은 날 수를 선택:
7A + B
를 얻는 주 + 남은 코인만큼 하루씩 채우는 방법1주를 더 로그인해서 목표를 초과 달성하는 방법
경우 2의 테스트 케이스:
A = 1, B = 1000, C = 1001
하루에 1개씩 모아서 1001개를 만들려면 1001일 필요
하지만 1주만 연속 로그인하면 1007코인을 얻어 단 7일 만에 달성 가능
✅ 코드 (Java)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
// https://www.acmicpc.net/problem/16785
// 한 주에 얻을 수 있는 코인을 계산하고, 목표 코인을 채우기 위해 몇 주를 반복할 수 있는지와 남은 코인을 계산
// 경우 1: 계산한 주차 수만큼 로그인하고 남은 코인을 하루씩 채우는 경우의 총 일수
// 경우 2: 1주를 더 로그인하여 남은 코인을 보너스를 포함해 한 번에 채우는 경우의 총 일수
// 두 경우 중 더 적은 로그인 횟수를 출력
public class B16785_ソーシャルゲーム_Social_Game {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken()); // 하루 로그인 시 얻는 코인 수
int B = Integer.parseInt(st.nextToken()); // 7일 연속 로그인 시 추가로 받는 보너스 코인
int C = Integer.parseInt(st.nextToken()); // 목표 코인 수
int oneWeek = 7 * A + B; // 7일간 연속 로그인 시 얻는 총 코인 수
int weekCnt = C / oneWeek; // 목표 코인 C를 채우기 위해 필요한 전체 주차 수
int remain = C - oneWeek * weekCnt; // 주차별로 얻은 코인을 제외하고 남은 코인 수
// 경우 1: weekCnt 주차만큼 로그인하고, 남은 코인을 하루씩 추가로 로그인하여 채우는 경우의 총 일수
int case1 = weekCnt * 7 + (remain + A - 1) / A;
// 경우 2: 1주 더 로그인해서 목표 코인을 초과해서 채우는 경우의 총 일수
int case2 = (weekCnt + 1) * 7;
System.out.println(Math.min(case1, case2)); // 출력
br.close();
}
}
💾 제출 결과
🧩 새롭게 알게 된 점
-
Math.ceil()
없이 올림 구현하는 방법
( x / y )의 올림 = (x + y - 1) / y [단, x, y는 정수, y > 0]
“나머지가 존재하면 무조건 몫을 1 올리는 방법”
⇒ x에 y-1을 더해서 다음 배수로 끌어올린 뒤 나누는 방법