백준 <주사위 세 개> (C++ 랜덤함수)

2026. 4. 3. 15:53Programmers

다음과 같은 문제를 풀게 되었다.

 

그러다가 문제가 생겼다. C++에서 랜덤 함수를 사용해본 적이 없어 시작부터 막혀버렸다.

 

그래서 간단하게 C++ 랜덤함수를 찾아보고 사용해보았다.


C++에서 랜덤함수

C++에서 랜덤함수를 사용하려면 상단에 헤더를 선언해줘야 한다.

 

기본적인 틀은 다음과 같다.

#include <random>

random_device 변수1;
mt19937 변수2(변수1());
uniform_int_distribution <int> 변수3(1, 6);
  • 변수1
    • 시드를 만들기 위한 객체
  • 변수2
    • 난수를 생성하는 엔진 객체
  • 변수3
    • 원하는 범위의 정수로 바꿔주는 분포 객체

 

아래는 백준의 문제를 풀다가 본 코드이다.

 


오답노트

answer = gen1 * 1000; 에서 왜 오류가 나는지 확인하다보니 너무 코드를 잘못 쓰고 있었다.

 

이상한 부분을 다시 보니 틀린 부분이 세 가지 있었다.

  1. 시드를 3개나 만들었다.
  2. 분포객체를 안만들었다.
  3. 엔진객체를 그대로 변수처럼 사용해 오류가 났다.

이 부분을 해결하기 위해 따로 int 변수를 만들어 랜덤 값을 넣는 변수 a, b, c 세 개를 만들어 오류를 해결하고 코드를 완성해보면 다음과 같다.

 

#include <iostream>
#include <random>

int main()
{
    std::random_device rd;
    
    std::mt19937 gen(rd());
    std::uniform_int_distribution<int> dist(1,6);
    
    int a = dist(gen);
    int b = dist(gen);
    int c = dist(gen);
    int answer;
    
    if (a == b && b == c)
    {
        answer = a * 1000 + 10000;
    }
    else if (a == b || b == c || a == c)
    {
        if (a==b || a==c)
            answer = a*100 + 1000;
        else
            answer = b*100 + 1000;
    }
    else
    {
        a = (a>b) ? a : b;
        answer = (a>c) ? a*100 : c*100;
    }
    
    std::cout << a << ' ' << b << ' ' << c << '\n' <<answer << '\n';
    return 0;
}

 

핵심은 if 조건문으로 주사위 값을 비교하는 것이다.

 


정리

C++에서 랜덤 값을 처음 접해봤는데 생소한 변수 타입과 함수를 사용해 어색했지만 자주 접해보며 적응해야 할 부분인 것 같다.

 

+ 이 문제는 입력을 받고 입력 받은 값에 따라 바뀌는 문제라서 랜덤함수와는 전혀 관련이 없다는 것을 알았습니다...