백준/C++

[백준] 2480번: 주사위 세개 | C++ 풀이

성실한 당근농부 2023. 5. 6. 10:34

# 문제

3개 주사위의 나온 눈이 주어질 때, 상금을 계산하는 프로그램을 작성 하시오.

 


 

# 풀이 1

경우를 나누고 구해야 할 것이 여태까지에 비해 조금은 많은 문제다.

우선 주어진 규칙에 따라 같은 눈이 없는 경우, 2개인 경우, 모두 같은 경우를 나누어야 한다.

 

그 다음 같은 눈이 없는 경우에는 가장 큰 눈을 찾아주고,

같은 눈이 2개인 경우에는 같은 눈 값을 찾아주면 된다.

 

정답 소스코드를 확인하고, 차분히 하나씩 경우를 나눠 코드를 작성해보자.

 

#include <iostream>
using namespace std;

int main(){
    int num[3];
    int max, tmp; // max: 최댓값 tmp: 같은 눈 2개 나온 경우, 같은 눈
    cin >> num[0] >> num[1] >> num[2];
  
    // 모두 같은 눈이 나온 경우
    if(num[0] == num[1] && num[1] == num[2] && num[0] == num[2])
        cout << 10000 + num[0]*1000;
    
    // 모두 다른 눈이 나온 경우
    else if(num[0] != num[1] && num[1] != num[2] && num[0] != num[2]){
        max = num[0];
        for(int i=1; i<3; i++){
        if(max<num[i]) max = num[i];
        }
        cout << max*100;
    }
   
    // 같은 눈이 2개 나온 경우
    else{
        if(num[0] == num[1] || num[0] == num[2]) tmp = num[0];
        else tmp = num[1];
        cout << 1000 + tmp*100;
    }
    return 0;
}

 

우선 이번에는 입력되는 값을 정수 변수가 아닌, 정수 배열에 담아주었다.

이는 모두 다른 눈이 나왔을 경우, 최댓값 계산을 간단히 하기 위함이라고 기억하고 넘어가자.

하지만 만약... for문을 아직 모르는 분이고, 조건문 단계의 문제니 조건문으로 구하고 싶다면 다른 방법을 소개하도록 하겠다.

 

 

🎲 모두 같은 눈이 나온 경우

// 모두 같은 눈이 나온 경우
if(num[0] == num[1] && num[1] == num[2] && num[0] == num[2])
	cout << 10000 + num[0]*1000;

모두 같은 눈이 나온 경우의 조건식이 가장 간단하기 때문에 첫번째 if문에 넣어주었다.

비교연산자 ==와 논리연산자 &&를 사용해 모두 같은 눈이 나온 경우를 찾고, 문제에서 요구한대로 출력해주었다.

이때 1000에 곱해지는 값은 세 눈 값이 모두 같으므로 num[0], num[1], num[2] 중 어떤 것을 넣어주어도 괜찮다.

 

 

🎲 같은 눈이 없는 경우

// 모두 다른 눈이 나온 경우
else if(num[0] != num[1] && num[1] != num[2] && num[0] != num[2]){
    max = num[0];
    for(int i=1; i<3; i++){
    	if(max<num[i]) max = num[i];
    }
    cout << max*100;
    }

모두 같은 눈이 나온 경우를 찾았다면 같은 눈이 없는 경우(모두 다른 눈이 나온 경우)도 쉽게 찾을 수 있다.

이번엔 비교연산자 !=와 논리연산자 &&를 사용해 모두 다른 눈이 나온 경우를 판별하였다.

이때는 가장 큰 눈을 찾아야하는데, 최댓값을 num[0]으로 설정해두고 for문을 통해 나머지 값과 비교해주었다.

그 후 문제에서 요구한대로 최댓값과 100을 곱한 값을 출력해주면 끝이다.

 

 

🎲 같은 눈이 2개인 경우

// 같은 눈이 2개 나온 경우
else{
    if(num[0] == num[1] || num[0] == num[2]) tmp = num[0];
    else tmp = num[1];
    cout << 1000 + tmp*100;
    }

마지막은 같은 눈이 2개인 경우다.

이 경우에는 같은 눈의 값을 찾아주어야 하는데, 앞서 모두 같은 값을 가진 경우는 걸러졌기 때문에 간단한 조건문으로 구하는 값을 찾을 수 있다.

 

첫번째 if문에서 비교연산자 ==와 논리연산자 ||를 사용해 첫번째와 두번째 주사위의 눈이 같은 경우, 혹은 첫번째와 세번째 주사위의 눈이 같은 경우를 찾아준다. 두 경우 모두 첫번째 주사위와 비교한 것이므로 같은 눈 값은 num[0]으로 설정해주면 된다.

그리고 나머지 else문은 두번째와 세번째 주사위의 눈이 같은 경우이므로 두번째 주사위 값을 넣어주었다. 이때는 비교한 두 값이 같으므로 tmp값에 num[1]과 num[2]중 어떤 것을 넣어주어도 괜찮다.

 

그리고 문제에서 요구한대로 찾아낸 같은 눈 값(tmp)과 100을 곱하고, 1000과 더해 출력해주면 마지막 경우도 끝!

 

 

주석을 제외할 경우 코드 길이는 540B 정도 나온다

 

 


 

# 풀이2

앞선 풀이1과 논리전개는 같지만 for문을 모르거나 조건문으로만 풀어보고 싶다는 분들을 위한 풀이다.

이때는 최댓값을 찾을 때 정직하게 조건문을 넣어 값을 구해주면 된다.

다른 모든 경우는 동일하지만 모두 다른 눈이 나온 경우, 최댓값을 구하는 과정만 달라졌으니 그 부분만 설명을 덧붙였다.

정답 소스코드를 확인해보자.

 

#include <iostream>
using namespace std;

int main(){
    int a, b, c;
    int max, tmp;
    cin >> a >> b >> c;
  
    // 모두 같은 눈이 나온 경우
    if(a == b && b == c && a == c)
        cout << 10000 + a*1000;
    
    // 모두 다른 눈이 나온 경우
    else if(a != b && b != c && a != c){
        max = a;
        if(a < b){
            if(b < c) max = c;
            else max = b;
        }else if(a < c) max = c;
        cout << max*100;
    }
   
    // 같은 눈이 2개 나온 경우
    else{
        if(a == b || a == c) tmp = a;
        else tmp = b;
        cout << 1000 + tmp*100;
    }
    return 0;
}

 

이번에는 평소처럼 입력되는 값을 정수 변수에 담아주었다.

 

 

🎲 풀이2 | 같은 눈이 없는 경우

// 모두 다른 눈이 나온 경우
else if(a != b && b != c && a != c){
    max = a; // defalut: a > b > c인 경우
    if(a < b){
        if(b < c) max = c; // a < b < c 인 경우
        else max = b; // a < b, b > c인 경우
    }else if(a < c) max = c; // a > b, a < c인 경우
    cout << max*100;
}

다른 건 모두 같다. 우선 이번에도 비교연산자 !=와 논리연산자 &&를 사용해 모두 다른 눈이 나온 경우를 판별하였다.

그리고 defalut 값으로 a > b > c인 경우를 가정해, 최댓값에 a를 넣어주고 시작했다.

 

첫번째 if문은 a < b 인 경우이다.

이 if문 안에서도 b < c 인 경우와 b > c 인 경우, 두 가지가 존재하기 때문에 조건문을 한 번 더 사용해주었다.

 

그 다음 else문이 아닌 else if문으로 조건식 값을 넣어준 이유는 defalut 값를 a > b > c인 경우로 설정했기 때문이다.

첫번째 if문에 걸리지 않는 a > b인 경우에도  a > c (defalut), a < c 두 가지의 경우가 존재하기 때문에, else if문을 통해 a < c인 경우를 찾아 max 값을 변경해주었다.

 

그 후 동일하게 문제에서 요구한대로 최댓값과 100을 곱한 값을 출력해주면 풀이2도 끝이다.

 

✨조건문을 여러 개 중첩하여 쓸 때는 빠지는 경우가 없는지 잘 체크해서 코드를 작성해야 함을 유의하자.

 

 

주석을 제외할 경우 코드 길이는 491B 정도 나온다

 

 


 

 

 

2480번: 주사위 세개

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.  같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.  같은 눈이 2개

www.acmicpc.net

 

728x90