[프로그래머스 / C++] 주사위 게임 3

YH·2023년 12월 10일
0

문제

주사위 게임 3 : 문제 링크


문제 분석

  • 1부터 6까지 숫자가 적힌 주사위가 네 개 있다. 네 주사위를 굴렸을 때 나온 숫자에 따라 다음과 같은 점수를 얻는다.
    • 네 주사위에서 나온 숫자가 모두 p로 같다면 1111 x p점을 얻는다.
    • 세 주사위에서 나온 숫자가 p로 같고 나머지 다른 주사위에서 나온 숫자가 q(p != q)라면 (10 x p + q)^2 점을 얻는다.
    • 주사위가 두 개씩 같은 값이 나오고, 나온 숫자를 각각 p, q(p != q)라고 한다면 (p + q) x |p - q|점을 얻는다.
    • 어느 두 주사위에서 나온 숫자가 p로 같고 나머지 두 주사위에서 나온 숫자가 각각 p와 다른 q, r(q != r)이라면 q x r점을 얻는다.
    • 네 주사위에 적힌 숫자가 모두 다르다면 나온 숫자 중 가장 작은 숫자 만큼의 점수를 얻는다.
  • 네 주사위를 굴렸을 때 나온 숫자가 정수 매개변수 a, b, c, d로 주어질 때, 얻는 점수를 return
  • 벡터의 오름차순 정렬을 위해 sort() 함수를 사용할 것 이므로 algorithm 헤더를 포함
  • 정수형 벡터 v를 선언하고, a, b, c, d 값을 저장. sort() 함수를 사용하여 벡터 v를 오름차순으로 정렬. if문을 통해 v의 첫번째와 마지막 값을 비교하여 같다면 네 숫자가 모두 같음을 의미하므로 1111에 v[0]값을 곱한값을 return. else if문들을 통해 1)v[0]와 v[2] 2) v[1]와 v[3]을 비교하여 같다면 세 숫자가 같음을 의미하므로 (10 x p + q)^2 연산값을 return. 또 다른 else if문들을 통해 1)v[0]와 v[1] 2)v[1]와 v[2] 3)v[2]와 v[3]을 비교하여 같다면 나머지 2개의 값이 같은지 비교. 같다면 (p + q) x |p - q|를 다르다면 q x r을 return.(이때, 절대값은 abs() 함수를 사용하여 계산) 위 조건을 모두 충족하지 못했다면 네 숫자가 모두 다름을 의미하므로 else문을 통해 v[0]을 return

algorithm 헤더의 sort() 함수 사용법
void sort(T start, T end, Compare comp); //comp 인자가 공란이면 오름차순 정렬

  • sort(v.begin(), v.end(), compare); // 사용자 정의 함수 사용
  • sort(v.begin(), v.end(), greater<자료형>()); // 내림차순
  • sort(v.begin(), v.end(), less<자료형>()); // 오름차순

풀이

#include <algorithm>

using namespace std;

int solution(int a, int b, int c, int d) {
    vector<int> v = {a, b, c, d};
    
    sort(v.begin(), v.end());
    if(v[0] == v[3]) return 1111 * v[0];
    else if(v[0] == v[2]) return (10 * v[0] + v[3]) * (10 * v[0] + v[3]);
    else if(v[1] == v[3]) return (10 * v[1] + v[0]) * (10 * v[1] + v[0]);
    else if(v[0] == v[1]) {
        if(v[2] == v[3]) return (v[0] + v[2]) * abs(v[0] - v[2]);
        else return v[2] * v[3];
    }
    else if(v[1] == v[2]) {
        if(v[0] == v[3]) return (v[0] + v[1]) * abs(v[0] - v[1]);
        else return v[0] * v[3];
    }
    else if(v[2] == v[3]) {
        if(v[0] == v[1]) return (v[0] + v[2]) * abs(v[0] - v[2]);
        else return v[0] * v[1];
    }
    else return v[0];
}
profile
Keep Recycling Your Dreams

0개의 댓글