백준 알고리즘11387 번
https://www.acmicpc.net/problem/11387
11387번: 님 무기가 좀 나쁘시네여
각 줄마다 "공격력", "힘", "치명타 확률", "치명타 피해비율", "공격속도 증가"의 수치를 나타내는 다섯 개의 정수가 공백을 사이에 두고 순서대로 주어진다. 첫 번째 줄은 무기를 장착한 크리의
www.acmicpc.net
11387번
크리와 파부는 현재 무기를 장착 중이다. 그때의 공격력, 힘, 치명타 확률, 치명타 피해비율, 공격속도 증가를 알고 있고 장착 중인 무기의 공격력, 힘, 치명타 확률, 치명타 피해비율, 공격속도 증가를 알고 있다고 했을 때, 현재 크리의 전투력과 크리가 파부의 무기를 장착했을 때의 전투력 그리고 현재 파부의 전투력과 파부가 크리의 무기를 장착했을 때의 전투력을 비교하고 싶다. (치명타 확률, 치명타 피해비율, 공격속도 증가는 비율이므로 100으로 나눠야 한다.)
입력으로 크리와 파부의 공격력, 힘, 치명타 확률, 치명타 피해비율, 공격속도 증가가 들어오고 그 다음 2개의 줄에 크리와 파부의 무기의 공격력, 힘, 치명타 확률, 치명타 피해비율, 공격속도 증가가 들어온다.
출력으로 현재 크리의 전투력과 크리가 파부의 무기를 장착했을 때의 전투력보다 크면 +, 같으면 0, 작으면 -를, 마찬가지로 현재 파부의 전투력과 파부가 크리의 무기를 장착했을 때의 전투력보다 크면 +, 같으면 0, 작으면 -를 출력하면 된다.
문제 해결
처음에 double로 풀었는데 틀렸다. 100으로 나눠줘야 해서 double로 했는데 안되서 모두 100을 더해줘서 long으로 해봤는데 안됬다.
구글링을 해봤더니 BigDecimal 을 사용하려고 해서 사용해봤는데 처음에 틀렸다,,
그래서 식을 잘못 썼나 했더니 그건 아니었는데,, 알고보니 입력을 받을 때부터 비율들을 100으로 나눠줬는데 그 부분을 고치니 바로 맞았다,,
코드
package boj11387;
import java.math.BigDecimal;
import java.util.Scanner;
// 부동 소수점 떄문에 BigDecimal을 사용해야한다.
// 이때 비율인 것을 입력받을 때부터 100으로 나누면 안된다.
public class Main {
// attack, power, hit, harm, speed
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
double[] currKree = { sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble() };
double[] currPabu = { sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble() };
double[] kreeWeapon = { sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble() };
double[] pabuWeapon = { sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble(), sc.nextDouble() };
double[] Kree = new double[5];
double[] Pabu = new double[5];
for (int i = 0; i < 5; i++) {
Kree[i] = currKree[i] - kreeWeapon[i];
Pabu[i] = currPabu[i] - pabuWeapon[i];
}
double[] kreeWP = new double[5];
double[] pabuWK = new double[5];
for (int i = 0; i < 5; i++) {
kreeWP[i] = Kree[i] + pabuWeapon[i];
pabuWK[i] = Pabu[i] + kreeWeapon[i];
}
BigDecimal KreeStat = stat(currKree);
BigDecimal PabuStat = stat(currPabu);
BigDecimal KreeWPStat = stat(kreeWP);
BigDecimal PabuWKStat = stat(pabuWK);
char ansK = '0';
char ansP = '0';
if (KreeStat.compareTo(KreeWPStat) > 0) {
ansK = '-';
} else if (KreeStat.compareTo(KreeWPStat) < 0) {
ansK = '+';
}
if (PabuStat.compareTo(PabuWKStat) > 0) {
ansP = '-';
} else if (PabuStat.compareTo(PabuWKStat) < 0) {
ansP = '+';
}
System.out.println(ansK);
System.out.println(ansP);
}
// 전투력 = arr[0] * (100 + arr[1]) * (a + b) * (100 + arr[4]
// a = 100 - min(arr[2], 100)
// b = min(arr[2],100) * arr[3]
public static BigDecimal stat(double[] arr) {
BigDecimal attack = BigDecimal.valueOf(arr[0]);
BigDecimal power = BigDecimal.valueOf(arr[1]).divide(BigDecimal.valueOf(100.0));
BigDecimal hit = BigDecimal.valueOf(arr[2]).divide(BigDecimal.valueOf(100.0));
BigDecimal harm = BigDecimal.valueOf(arr[3]).divide(BigDecimal.valueOf(100.0));
BigDecimal speed = BigDecimal.valueOf(arr[4]).divide(BigDecimal.valueOf(100.0));
BigDecimal one = BigDecimal.valueOf(1.0);
BigDecimal min1 = one.min(hit);
BigDecimal temp = one.subtract(min1);
temp = temp.add(min1.multiply(harm));
power = power.add(one);
speed = speed.add(one);
return attack.multiply(power).multiply(temp).multiply(speed);
}
}
결과
'Algorithm' 카테고리의 다른 글
백준 2660번 <회장 뽑기> (0) | 2022.09.24 |
---|---|
백준 17086번 <아기 상어2> (0) | 2022.09.24 |
백준 17070번 <파이프 옮기기1> (0) | 2022.09.17 |
백준 2310번 <어드벤처 게임> (0) | 2022.09.15 |
백준 16918번 <봄버맨> (0) | 2022.08.27 |
댓글