문제
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.
- 같은 눈이 3개가 나오면 10,000원 + (같은 눈) x 1,000원의 상금을 받게 된다.
- 같은 눈이 2개만 나오는 경우에는 1,000원 + (같은 눈) x 100원의 상금을 받게 된다.
- 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈) x 100원의 상금을 받게 된다.
예를 들어, 3개의 눈 3, 3, 6이 주어지면 상그믄 1,000 + 3 x 100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000 + 2 x 1,000으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6 x 100으로 계산되어 600원을 상금으로 받게 된다.
3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.
입력 조건
첫째 줄에 3개의 눈이 빈칸을 사이에 두고 각각 주어진다.
출력 조건
첫째 줄에 게임의 상금을 출력 한다.
풀이
우선 1, 2, 3 조건을 연산식으로 바꿔주어야 한다.
주사위가 총 3개이기 때문에 dice1, dice2, dice3로 주사위 이름을 정해주었다.
같은 눈이 3개가 나오면 10,000원 + (같은 눈) x 1,000원의 상금을 받게 된다.
dice1 == dice2 == dice3 일때 모두 2가 나왔다고 하면 10,000원 + 2 x 1,000 = 12,000원이 나오게 된다.
이때 if(dice1 == dice2 == dice3)로 하게 되면 컴파일 에러가 나게 된다.
자바에서는 dice1 == dice2 == dice3와 같은 표현은 허용되지 않습니다. 이는 자바의 연산자 우선순위와 연관이 있습니다. == 연산자는 왼쪽에서 오른쪽으로 평가되며, 그 결과는 boolean 타입입니다. 따라서 dice1 == dice2 == dice3 표현은 dice1 == dice2를 먼저 평가하고 그 결과 (true 또는 false)를 dice3와 비교하려고 시도합니다. 이는 올바르지 않은 비교로 간주되어 컴파일 에러를 발생시킵니다.
따라서 if (dice1 == dice2 && dice2 == dice3) 으로 표현을 해주어야 한다.
if (dice1 == dice2 && dice2 == dice3) {
prize = 10000 + dice1 * 1000;
}
2번째 조건은 같은 눈이 2개만 나오는 경우에는 1,000원 + (같은 눈) x 100원의 상금을 받게 된다.
이때는 || or연산자를 사용해주면 된다.
else if (dice1 == dice2 || dice1 == dice3) {
prize = 1000 + dice1 * 100;
} else if (dice2 == dice3) {
prize = 1000 + dice2 * 100;
}
경우의 수는 dice1과 dice2만 같을 경우, dice1과 dice3만 같은 경우, dice2와 dice3만 같을 경우
총 3개이기 때문에 총 3개의 조건이 나오게 된다.
마지막 3번째 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈) x 100원의 상금을 받게 된다.
여기서도 조금 헤맸는데 Math.max는 2개의 수만 비교가 가능하기 때문에 2겹을 해줘야 3개를 비교할 수 있다고 한다.
Math.max 함수는 두 개의 인자만 비교할 수 있습니다. 즉, 한 번에 두 개의 숫자 값 중에서 큰 값을 반환합니다. 그래서 세 개 이상의 숫자를 비교하려면 Math.max를 두 번 이상 사용해야 합니다.
else {
prize = Math.max(Math.max(dice1, dice2), dice3) * 100;
}
dice1과 dice2를 먼저 비교하고 둘 중 큰 수가 dice3 중 큰 수를 출력해서 100과 곱해준다? 로 보면 된다.
여튼 이걸 돌려보면 요구조건과 동일하게 출력된다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int dice1 = scanner.nextInt();
int dice2 = scanner.nextInt();
int dice3 = scanner.nextInt();
int prize;
if (dice1 == dice2 && dice2 == dice3) {
prize = 10000 + dice1 * 1000;
} else if (dice1 == dice2 || dice1 == dice3) {
prize = 1000 + dice1 * 100;
} else if (dice2 == dice3) {
prize = 1000 + dice2 * 100;
} else {
prize = Math.max(Math.max(dice1, dice2), dice3) * 100;
}
System.out.println(prize);
}
}
끝...!
정리
논리연산자 2개 이상 비교 안되는 걸 이제 알았다. 나 코딩한지 1년 됐는데 ^^...
그리고 Math.max를 저렇게 겹겹이 사용하면 3가지를 비교할 수 있는것도 오늘 알았다.
실제로 사용해볼 일이 많지 않다보니깐 이런게 있다 정도만 하고 넘어가지 않았나 싶다.
'Knowledge > Algorithm' 카테고리의 다른 글
[9086/JAVA] 문자열 (0) | 2024.01.06 |
---|---|
[20304/JAVA] 영수증 (1) | 2024.01.05 |
[2438/JAVA] 별 찍기 - 1 (0) | 2023.12.30 |
[10872/JAVA] 팩토리얼 (0) | 2023.12.29 |
[10951/JAVA] A+B - 4 (0) | 2023.12.23 |
쓰임 있는 사람이 되기 위해 노력 중입니다.