티스토리 뷰

반응형

www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

 


 

⊙ 문제

⊙ 입력

⊙ 출력

⊙ 예제 입출력

⊙ 알고리즘 분류

  • 그리디 알고리즘

 


 

⊙ 문제 접근 과정

 

조건에서 입력도 무작위가 아닌 친절하게 오름차순으로 정렬하여서 입력하라고 한다.

 

막힘없이 코드를 작성했고 예제 입출력과 같은 값을 출력할 수 있었다.

하지만 틀렸다고 떴다. 아래 코드이다.

 

#include <iostream>

using namespace std;

int main() {
    int N,K;
    int count = 0;
    cin >> N >> K;

    int money[N];
    for (int i =0; i<N;i++) {
        cin>>money[i];
    }

    for (int i =N; i>0;i--) {
        if (money[i]<=K) {
            K-=money[i];
            count++;
        }
    }

    cout << count;
}

예제 입출력 1, 2번 전부 값이 바르게 나왔다.

하지만 틀렸다. 예외가 존재한다는 말이다.

 

N=1, K=1, Ai=1이면 count 값이 0이 나온다. 그리고 마이너스 인덱스가 나올 수도 있는 코드이다.

 

그래서 int 배열이 아닌 vector로 수정하여 다시 접근했다.

pushpop을 이용하여 인덱스를 사용하지 않고 반복문을 돌려서 값을 도출했다.

무한 반복문을 돌리고 break로 탈출하게 했다.

 


 

⊙ 문제 풀이

 

#include <iostream>
#include <vector>
using namespace std;

int main() {
    int N,K;
    int count = 0;
    cin >> N >> K;

    int a[N];
    vector<int> money;
    for (int i =0; i<N;i++) {
        cin>>a[i];
        money.push_back(a[i]);
    }

    for (;;) {
        while(money.back() <=K) {
            K-=money.back();
            count++;
        }
        money.pop_back();

        if(K==0)
            break;
    }

    cout << count;
}

⊙ 결과

 

 


⊙ 마무리

 

 

NONE

 

좋아요 로그인하지 않아도 누를 수 있습니다!

 

 

728x90
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함