[백준 | C++] 2480.주사위 세개_if문/max/==/!=

수아·2024년 8월 24일
0

codingtest

목록 보기
5/7

문제

1에서부터 6까지의 눈을 가진 3개의 주사위를 던져서 다음과 같은 규칙에 따라 상금을 받는 게임이 있다.

  • 같은 눈이 3개가 나오면 10,000원+(같은 눈)×1,000원의 상금을 받게 된다.
  • 같은 눈이 2개만 나오는 경우에는 1,000원+(같은 눈)×100원의 상금을 받게 된다.
  • 모두 다른 눈이 나오는 경우에는 (그 중 가장 큰 눈)×100원의 상금을 받게 된다.
    예를 들어, 3개의 눈 3, 3, 6이 주어지면 상금은 1,000+3×100으로 계산되어 1,300원을 받게 된다. 또 3개의 눈이 2, 2, 2로 주어지면 10,000+2×1,000 으로 계산되어 12,000원을 받게 된다. 3개의 눈이 6, 2, 5로 주어지면 그중 가장 큰 값이 6이므로 6×100으로 계산되어 600원을 상금으로 받게 된다.

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

정답 코드

#include <iostream>
using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    
    if (a == b && b == c) {
        // 세 개의 주사위 눈이 모두 같을 때
        cout << 10000 + (a * 1000);
    } else if (a == b || a == c) {
        // 두 개의 주사위 눈이 같을 때 (a와 b 또는 a와 c가 같을 때)
        cout << 1000 + (a * 100);
    } else if (b == c) {
        // 두 개의 주사위 눈이 같을 때 (b와 c가 같을 때)
        cout << 1000 + (b * 100);
    } else {
        // 모두 다른 경우
        cout << max(a, max(b, c)) * 100;
    }
    
    return 0;
}

나의 시행착오

처음 제출한 코드는 이러했다

#include <iostream>
using namespace std;

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    
    if(a==b==c){
        cout<<10000+(a*1000);
    }else if(a!=b!=c){
        cout<<max(a,b,c)*100;
    }else{
        if(a==b){
            cout<<1000+(a*100);
        }else if(a==c){
            cout<<1000+(c*100);
        }else if(b==c){
            cout<<1000+(b*100);
        }else{return 0;}
    }
    return 0;
}

제일 단순한 경우인 모두 같은 경우/ 모두 다른 경우를 먼저 정의해주고 하면 더 짧지 않을까 ?생각했다.
...
여기서 잠깐

==, !=

  • a==b==c / a!=b!=c 는 내가 의도한 대로 작동되지 않는다
  • a==b의 값은 true/false이기 때문에
    - true==c 꼴이 되는 셈!
  • a==b && b==c 로 수정해주기!

수정해줬음에도 처음엔 틀렸다. 왜일까?

  • a==b && b==c 인 경우는 a,b,c가 모두 동일함이 맞다
    그러나...
  • a!=b && b!=c는 a,b,c가 모두 다른 경우라고 하기 어렵다
    a==c인 경우가 있을 수 있기 때문!
  • 따라서 a!=b && b!=c && a!=c라고 해줘야 오류가 발생하지 않는데.. 여기서부터 복잡해짐이 느껴졌다.

max(a,b)

추가적으로 문법적 오류가 났던 부분

max는 인수를 2개만 가지는 함수이다!
따라서 max(a,max(b,c) 라고 작성해야한다.

이러한 과정 끝에 나온 나의 코드,,,

#include <iostream>
using namespace std;

int main()
{
    int a,b,c;
    cin>>a>>b>>c;
    
    if(a==b && b==c ){
        cout<<10000+(a*1000);
    }else if(a!=b && b!=c && a!=c){
        cout<<max(a,max(b,c))*100;
    }else{
        if(a==b){
            cout<<1000+(a*100);
        }else if(a==c){
            cout<<1000+(c*100);
        }else if(b==c){
            cout<<1000+(b*100);
        }else{return 0;}
    }
    return 0;
}

결국에는 하나하나 다 비교하는 코드로 뭔가 마음에 들지 않는다..
다시 정답 코드로 돌아가보자

#include <iostream>
using namespace std;

int main()
{
    int a, b, c;
    cin >> a >> b >> c;
    
    if (a == b && b == c) {
        // 세 개의 주사위 눈이 모두 같을 때
        cout << 10000 + (a * 1000);
    } else if (a == b || a == c) {
        // 두 개의 주사위 눈이 같을 때 (a와 b 또는 a와 c가 같을 때)
        cout << 1000 + (a * 100);
    } else if (b == c) {
        // 두 개의 주사위 눈이 같을 때 (b와 c가 같을 때)
        cout << 1000 + (b * 100);
    } else {
        // 모두 다른 경우
        cout << max(a, max(b, c)) * 100;
    }
    
    return 0;
}
  • a=b 또는 a=c인 경우는 결과 함수를 한 줄로 묶어줄 수 있다.
  • 처음에 모두 같은 경우, 다음에 두 개가 같은 경우를 먼저 해줬더니 3개 모두 다른 경우는 그냥 예외 처리가 가능하다.

어떤 경우가 가장 효율적인 경우인지 항상 고심하자!

profile
이제 갓 태어난 공순

0개의 댓글

관련 채용 정보