본문 바로가기

코딩

백준 2798 c++

카드를 N개의 숫자를 랜덤 생성하고 M의 숫자를 랜덤생성한다.

 

일단그럼 랜덤생성하는 함수를 알아야하는데..

 

 

 

 

 

 

 

<random>

먼저 위 코드 처럼 0 부터 99 까지의 난수를 생성하는 코드를 C++ 의 <random> 라이브러리를 사용해서 어떻게 작성하는지 살펴보도록 하겠습니다.

 코드 크기 줄이기 C/C++ 확대 축소
#include <iostream>
#include <random>

int main() {
  // 시드값을 얻기 위한 random_device 생성.
  std::random_device rd;

  // random_device 를 통해 난수 생성 엔진을 초기화 한다.
  std::mt19937 gen(rd());

  // 0 부터 99 까지 균등하게 나타나는 난수열을 생성하기 위해 균등 분포 정의.
  std::uniform_int_distribution<int> dis(0, 99);

  for (int i = 0; i < 5; i++) {
    std::cout << "난수 : " << dis(gen) << std::endl;
  }
}

가져왔다.

 

#include <random> 을 사용하면 된다.

 

랜덤으로 M 와 N개의 숫자를 정하고?

M에 가까운 N개의 숫자를 뽑아야하는데..

N개의 숫자중 가장큰 숫자부터 3개를 뽑는것도 아니다..

 

 

예를 들어 M이 21이고

 

N은 9 8 7 6 5 4 라면    9을 뽑으면    M은12인데 그럼 8 과 4를 뽑거나 7 과 2를 뽑아야한다.

그럼 9를 뽑지않고 21을 만드려면? 8 7 6 도 가능하다.21 

9를 무조건 뽑는거면  9를 뽑고 합이 남은 수가 되게끔 구할수있을텐데 뭐지..

 

 

해석을보자

 

 

 

 

 

정답

 

#include <iostream>
#define MAX 100
using namespace std;

 

int main() {
int num, target,goal,sum = 0;
int min = 9999999;
int arr[MAX] = {0, };
cin >> num >> target;
for(int i = 0; i < num; i++)

 

cin >> arr[i];
for(int i = 0; i < num-2; i++)
for(int j = i+1; j < num-1; j++)
for(int k = j+1; k < num; k++)
{
sum = arr[i]+arr[j]+arr[k];
if(target - sum < min && target - sum >= 0) {
min = target - sum;
goal = sum;
}
}
cout << goal;
}

 

 

일단 랜덤으로 수를 받는게 아니라 사용자가 입력을 하는거였구나.

 

 

 

왜 ofr문에서 i를 처음에 num-2 로 하는지 몰랐는데 이제

i가 0일떄 j는 0+1 이고 k는 1+1 이니까

 

i j k 는 각각 0 1 2 다.

그리고 k를 2부터 num 까지 돌리고?

다름 j를 하나 올리고 k를 반복 하면서 이 세 숫자를 왔다갔다하면서 다 숫자를 탐색하는 상중합인것 같다.

 

그렇게 i는 전체숫자중-2 번째 칸까지 다 왔다깠다   j는 -1번째 칸까지 k 는 n번째 까지 왔다갔다

 

다돌면

 

이런 것 같다.

 

 

 

sum = arr[i]+arr[j]+arr[k];
if(target - sum < min && target - sum >= 0) {
min = target - sum;
goal = sum;

 

 

다음 이걸 분석하면 합은 세 배열의 합이다.

 

 

target - sum이  0보다 같거나 크면서 999999보다 작을 경우

 

min에 target - sum을 넣고

sum을 goal 에 넣는다.

 

근데 왜..?

sum을 출력하는거보니  

 

target - sum 이 if문에 충족할때 제일 적합해지는거같은데?

 

 

 

 

 

 

느낀점

 

랜덤으로 수를 가져와서 하는건줄 알았는데 내가 문제이해를 잘못했다.

문제 이해력을 늘려야겠다. 이건 아예 생각을 못했어서 암기해야겠다.

삼중합 암기하기

'코딩' 카테고리의 다른 글

백준 10828 c++  (0) 2023.07.07
백준 12605 c++  (0) 2023.07.05
백준 9372 c++  (0) 2023.06.30
백준 28173 c++  (0) 2023.06.22
백준 28239 c++  (0) 2023.06.21