주사위 게임3

Subin·2024년 7월 24일

Algorithm

목록 보기
8/69

[다른 사람 풀이]

#include <string>
#include <vector>
#include <cmath>
#include <algorithm>

C++ 표준 라이브러리의 헤더 파일들을 포함합니다. string, vector, cmath, algorithm 헤더 파일을 사용합니다.

using namespace std;

표준 네임스페이스(std)를 사용합니다.

int solution(int a, int b, int c, int d) {
    int answer = 0;

함수 solution을 정의합니다. 이 함수는 네 개의 정수 a, b, c, d를 입력으로 받고, 정수형 값을 반환합니다. answer 변수를 초기화합니다.

    vector<int> table(6);
    table[a-1]++;    table[b-1]++;    table[c-1]++;    table[d-1]++;

길이 6의 벡터 table을 생성하고, 각 입력 값 a, b, c, d를 1씩 감소시켜 해당하는 인덱스의 값을 증가시킵니다. 즉, table 벡터는 각 숫자가 몇 번 나타났는지를 카운트합니다.

    vector<vector<int>> nums(5);
    nums[table[0]].emplace_back(1);
    nums[table[1]].emplace_back(2);
    nums[table[2]].emplace_back(3);
    nums[table[3]].emplace_back(4);
    nums[table[4]].emplace_back(5);
    nums[table[5]].emplace_back(6);

길이 5의 벡터 nums를 생성하고, 각 table의 값에 따라 해당 숫자를 nums의 적절한 위치에 추가합니다. 예를 들어, table[0]이 1이면 nums[1]에 1을 추가합니다.

    if(!nums[4].empty())    
    {
        return 1111*nums[4][0];

nums[4]가 비어있지 않으면, 즉 4번 나타난 숫자가 있다면 그 숫자에 1111을 곱해 반환합니다.

    }
    else if(!nums[3].empty())    
    {
        return pow(10*nums[3][0]+nums[1][0],2);

nums[3]가 비어있지 않으면, 즉 3번 나타난 숫자가 있다면 (10 * 그 숫자 + 1번 나타난 숫자)의 제곱을 반환합니다.

    }
    else if(nums[2].size() == 2)    
    {
        return (nums[2][0]+nums[2][1])*abs(nums[2][0]-nums[2][1]);

nums[2]의 크기가 2이면, 즉 2번 나타난 숫자가 2개이면 (두 숫자의 합) * (두 숫자의 차의 절댓값)을 반환합니다.

    }
    else if(nums[2].size() == 1)
    {
        return nums[1][0]*nums[1][1];

nums[2]의 크기가 1이면, 즉 2번 나타난 숫자가 1개이면 1번 나타난 두 숫자의 곱을 반환합니다.

    }
    else
    {
        return *min_element(nums[1].begin(),nums[1].end());

위의 모든 조건에 해당하지 않으면, 즉 모두 1번 나타난 숫자들이면 그 중 최소값을 반환합니다.

    }

    return answer;
}

마지막으로 answer를 반환하는데, 이 줄은 실제로는 도달하지 않습니다. 모든 조건은 이미 위에서 처리되기 때문입니다.


너무 노가다 식으로 풀어서 더 나은 방법을 찾던 중 발견한 풀이다.
같은 값이 나온 주사위를 배열에 넣어 4번 나타난 숫자, 3번, 2번, 1번 나타난 숫자를 구분하는 좋은 방식이 있었다.

profile
성장하며 꿈꾸는 삶을 살아가고 있는 대학생입니다😊

0개의 댓글