백준 16400 소수 화폐

2023. 2. 9. 14:30코딩 공부 연습

반응형

백준 16400 소수화폐


오늘은 소수화폐 문제를 풀었는데, 에라토스테네스를 이용해 소수를 구한 후 이를 이용해 dp 문제를 풀면 되었다.

동전 dp 문제를 오랜만에 풀었더니 기억이 잘 안나서 시간이 오래걸렸다. (알고리즘 문제 자체가 좀 오랜만인것 같기도 하고...)


우선 에라토스테네스로 소수를 구하는 방법이다.

    for (int i = 0; i<= 40000; i++)
    {
        visited[i] = true;
    }
    for (int i = 2; i <= 200; i++)
    {
        for (int j = i*2; j <= 40000; j+=i)
        {
            visited[j] = false;
        }
    }
    for (int i = 2; i<= 40000; i++)
    {
        if(visited[i] == true)
        {
            prime_list.push_back(i);
        }
    }

좀 긴데, 그래도 이게 외우기 제일 쉬워서 이걸로 하게 된 거 같다.


이제 이 소수들로 동전 dp 를 돌리기만 하면 된다.

    cin>>n;    
    for (int i = 0 ; i< prime_list.size(); i++)
    {
        for (int j = prime_list[i]; j <=n; j++)
        {
            dp[j] = (dp[j] + dp[j- prime_list[i]])%123456789;
            dp[j]%= 123456789;
        }
    }
  • 2부터 시작하여 dp[j] 에 dp[i] (소수) 를 뺀거 개수를 계속 추가해준다.
  • 예를 들어 dp[8] 에는
    • dp[8] = dp[8] + dp[6]
    • dp[8] = dp]8] + dp[5]
    • dp[8] = dp[8] + dp[3]

이렇게 값이 저장되는 것!!

'코딩 공부 연습' 카테고리의 다른 글

백준 10942 팰린드롬?  (0) 2023.02.18
백준 10826 피보나치 수 4  (0) 2023.02.14
백준 1153 네 개의 소수  (0) 2023.01.25
백준 2206 벽 부수고 이동하기  (0) 2023.01.12
백준 1707 이분 그래프  (0) 2023.01.11