▶ 문제
https://www.acmicpc.net/problem/2480
2480번: 주사위 세개
1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다. 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다. 같은 눈이 2개
www.acmicpc.net
▶ 설명
조건이 세 개가 있다.
1. 같은 눈이 3개가 나올 때
2. 같은 눈이 2개가 나올 때
3. 같은 눈이 0개가 나올 때 (다 다르게 나올 때)
조건에 따라 다른 연산을 수행하여 결과 값을 얻어야 한다.
문제 풀이 방식에 따라 &&와 || 연산자 이해와 Math.max( ) , Arrays.sort( ) 메소드를 사용해 볼 것이다.
▶ 문제 풀이
🌱 풀이1. && 와 || 연산자 사용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer strTo = new StringTokenizer(br.readLine(), " ");
int a = Integer.parseInt(strTo.nextToken());
int b = Integer.parseInt(strTo.nextToken());
int c = Integer.parseInt(strTo.nextToken());
int reward = 0;
if (a == b && b ==c) {
reward = 10000 + (a*1000);
}else if( a== b || a == c) {
reward = 1000 + (a*100);
}else if(b == c) {
reward = 1000 + (b*100);
}else {
reward = Math.max(Math.max(a, b), c) * 100;
}
System.out.println(reward);
}
}
문제에서 밝혀낸 조건 세 개와 별개로 실제 식에서는 네 개의 조건을 생성해야 한다.
1번째 if : (a == b && b ==c && c == a) <- 같은 눈이 3개가 나올 때
입력되는 주사위 눈의 수 세 개가 모두 같을 때를 나타낸다.
2번째 if : ( a== b || a == c) <- 같은 눈이 2개가 나올 때
공통으로 들어가는 a가 연산에서 쓰이게 된다. reward = 1000 + (a*100)
3번째 if : (b == c) <- 같은 눈이 2개가 나올 때
이 if 문을 통과할 차례라면 위의 if문을 만족하지 못했다는 의미이기 때문에 2번째 if 의 a== b 와 a == c 가 모두 거짓이므로 비교를 아직 하지 않은 b와 c가 같은지를 물어 같은 눈 2개를 만족하는 지에 대한 if문을 만들 수 있다.
4번째 if : (else) <- 같은 눈이 0개가 나올 때 (다 다르게 나올 때)
연산을 수행할 때 Math.max() 메소드를 사용해야 한다. max( ) 메소드는 두 개의 수만을 비교하여 최대값을 반환하므로 3개의 수를 비교해야 하는 이 조건식에서 이 메소드를 2번 중첩해서 사용하도록 한다.
🌱 풀이2. && 와 || 연산자 사용(2)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
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());
int C = Integer.parseInt(st.nextToken());
//최대값
int max = A;
//세 수가 같을때
if(A == B && B == C) {
System.out.println(10000 + (1000 * A));
//세 수가 다를때
}else if(A != B && B != C && A != C) {
//최대값 구하기
if(max < B) {
max = B;
}
if(max < C) {
max = C;
}
System.out.println(100 * max);
//두 수만 같을때
}else {
//같은 수 구하기
if(A != B) {
System.out.println(1000 + (100 * C));
}else if(A != C) {
System.out.println(1000 + (100 * B));
}
}
}
}
특별한 메소드를 쓰지 않았기 때문에 풀이1의 코드를 잘 이해했다면 어려울 것이 없는 코드이다.
🌱 풀이3. 배열 정렬 이용
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Boj_2480_Dice3 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int[] arr = new int[3];
for (int i = 0; i < 3; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
if (arr[0] == arr[2]) {
System.out.println(10000 + arr[0] * 1000);
} else if (arr[0] == arr[1]) {
System.out.println(1000 + arr[0] * 100);
} else if (arr[1] == arr[2]) {
System.out.println(1000 + arr[1] * 100);
} else {
System.out.println(arr[2] * 100);
}
}
}
입력 받은 1개의 값을 세 개의 수로 나누어 for 문을 통해 arr 배열에 담도록 한다.
그 뒤 Arrays.sort(arr) 를 통해서 오름차순으로 정렬한다.
요소의 값들을 비교하자면 arr[0] <= arr[1] <= arr[2] 가 될 것이다.
1번째 if : (arr[0] == arr[2]) <- 같은 눈이 3개가 나올 때
입력되는 주사위 눈의 수 세 개가 모두 같을 때를 나타낸다.
맨 첫 요소와 마지막 요소를 비교한 것이기 때문에 두 개가 같다면 전체가 같은 값이라는 것을 유추할 수가 있다.
2번째 if :(arr[0] == arr[1]) <- 같은 눈이 2개가 나올 때
1번째 if가 거짓이여서 그곳을 건너 뛰고 이번 if로 넘어온 것이기 때문에,
세 개의 눈이 같지는 않지만 두 눈이 같다는 의미이므로
같은 눈이 2개 나올 때를 나타낸다.
3번째 if : (arr[1] == arr[2]) <- 같은 눈이 2개가 나올 때
2번째 if문과 마찬가지 이유로 같은 눈이 2개 나오는 때를 나타낸다.
4번째 if : (else) <- 같은 눈이 0개가 나올 때 (다 다르게 나올 때)
정렬된 배열의 값들을 이용하는 것이기 때문에 풀이1과 다르게 max() 메소드를 굳이 사용하지 않아도 최대값이 마지막 요소인 arr[2] 인 것을 이미 알고 있다. 그래서 연산 식이 좀 더 간결해 보이게 된다.
▶ Log
알고나면 쉬운 문제일 수 있으나 처음에 풀어볼 땐 생각보다 많이 헤맸다.
조건식을 어떻게 써야 할지 머릿속에서 그려내는 것이 쉽지 않았는데
다른 코드를 참고해서 분석하니 if의 특성을 좀 더 이해할 수 있었다.
예를 들어 if 다음에 나오는 else if 문을 작성할 때 앞선 if 조건식의 큰 선택지를 제외시키게 되는데
마치 차집합이 연상되었다.
'백준 알고리즘 > 조건문' 카테고리의 다른 글
백준 2525번 :: 오븐 시계 (0) | 2022.05.18 |
---|---|
백준 2884번 :: 알람 시계 (0) | 2022.05.18 |
백준 14691번 :: 사분면 고르기 (0) | 2022.05.17 |
백준 9498번 :: 시험 성적 (0) | 2022.05.16 |
백준 1330번 :: 두 수 비교하기 (0) | 2022.05.16 |