카드를 N개의 숫자를 랜덤 생성하고 M의 숫자를 랜덤생성한다.
일단그럼 랜덤생성하는 함수를 알아야하는데..
<random>
먼저 위 코드 처럼 0 부터 99 까지의 난수를 생성하는 코드를 C++ 의 <random> 라이브러리를 사용해서 어떻게 작성하는지 살펴보도록 하겠습니다.
#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를 뽑고 합이 남은 수가 되게끔 구할수있을텐데 뭐지..
해석을보자
정답
일단 랜덤으로 수를 받는게 아니라 사용자가 입력을 하는거였구나.
왜 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번째 까지 왔다갔다
다돌면
이런 것 같다.
다음 이걸 분석하면 합은 세 배열의 합이다.
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 |