본문 바로가기

카테고리 없음

[H1730] 미식왕! 기문!

반응형
  • [H1730] 미식왕! 기문!
  • 문제  풀이에 대해 사외 온라인/오프라인에 게시/공유 하는 것은 금지되어 있습니다.  
       SW Expert
    아카데미의 문제는 삼성전자 직원에게만 오픈 되어 있습니다.


     [제한 사항]


    시간

    12개 테스트케이스를 합쳐서 C/C++의 경우 1 / Java의 경우 2/ Python의 경우 2

        메모리

    , 정적 메모리 합쳐서 256MB 이내, 스택 메모리 1MB 이내



    미식가 중 왕인 미식왕은 2가지 능력을 갖춰야 한다.


    맛을 이해하는 능력! 그리고 언제든 평가하기 위해 많이 먹을 수 있는 능력!


    모든 미식왕은 2가지 능력을 수치로 표현할 수 있다!


    양천주가 출신 기문이는 이제 갓 미식왕 협회에서 활동하기 시작했다. 이제 막 시작했기 때문에 이해력, 소화력 모두 1 밖에 되지 않는다.


    이제 기문이는 세계 맛집 투어를 다니며, 미식왕로서의 능력을 키울 것이다.


    맛집은 모두 총 N개가 있으며, 각 맛집 마다 타이틀 음식이 존재한다.


    타이틀 음식을 섭취하기 위해서는 최소한의 이해력이 필요하거나, 서빙되는 음식 양을 모두 소화할 수 있어야 한다.


    , 미식왕의 이해력이 음식의 이해력보다 이상이거나, 소화력이 음식의 양보다 이상이어야 한다.


    기문이는 특성 상 타이틀 음식을 섭취하면 미식왕 능력을 올릴 수 있는 점수를 받을 수 있으며, 해당 점수를 이해력 혹은 소화력에 자기 마음대로 분배할 수 있다.


    예를 들어, 이해력 8, 소화력 5인 사람이 음식을 먹어서 4의 점수를 받으면 (이해력, 소화력) (8, 9), (9, 8), (10, 7), (11, 6), (12, 5) 중 하나로 변할 수 있는 것이다.


    기문이는 맛집 투어를 자기가 원하는 순서대로 돌아다닐 수 있다.


    , 맛집을 중복해서 갈 수는 없다.


    맛집들의 타이틀 음식 정보가 주어졌을 때, 기문이가 갈 수 있는 최대 맛집 개수를 구하여라.   



    [입력]


    첫 번째 줄에 테스트 케이스의 수 T가 주어진다.


    각 테스트 케이스의 첫 번째 줄에는 맛집의 수 N(1N100)이 주어진다.


    둘째 줄부터 N개의 줄에 걸쳐서 각 타이틀 음식을 이해하기 필요한 이해력, 소화력과 이해했을 경우에 얻을 수 있는 점수가 순서대로 주어진다.


    이 숫자는 모두 1,000 이하의 자연수이다.



    [출력]


    테스트 케이스마다 #x(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고, 기문이가 있는 맛집의 최대 개수를 구하여라.



    입력 예제

     

    2

    5

    1 3 1

    10 20 5

    3 3 1

    3 1 1

    1 1 1

    3

    2 2 1

    2 3 1

    3 2 1

    // 테스트 케이스 개수

    // 맛집의 수 N = 5

    // 이해력 = 1, 소화력 = 3, 능력 점수 = 1

     

     

     

     

     

     

     

     




    출력 예제

     

    #1 4

    #2 0

    // 첫 번째 테스트 케이스 결과

     

  • (즉, 미식왕의 이해력이 음식의 이해력보다 이상이거나, 소화력이 음식의 양보다 이상이어야 한다.) <- or로 되어 있는거 같습니다.
    저는 둘중 하나만 만족하면 타이틀 점수를 얻을 수 있다고 풀고 있습니다만..잘못 이해한건지 안풀리네요.
    아래와 같이 정렬한 후...즉, 9의 이해력만 있으면 모든 음식점을 클리어 할 수 있다고 생각하는데 그럼 너무 쉬운거 같기도 하고..
    전체 케이스에 맞지 않네요..(8개/12개).. 제가 잘못 이해하는 부분이 있나요?
    10
    1 2 7
    1 6 1
    2 1 7
    2 3 8
    3 4 1
    4 15 3
    5 10 10
    7 17 10
    8 4 1
    9 13 6
    2017-11-03 18:01:38 댓글
    이해하신게 맞긴 한데, 모든 음식점을 클리어 할 수 있는지 없는지 구하는게 아니라 클리어 할 수 있는 최대 음식점 수를 구하는거라서요.
    예를 드신 건 필요한 이해력&소화력이 너무 작고 타이틀점수는 너무 많이 주는 best input 이라서. 조금 더 worst input 을 생각해보시면 좋을듯요.

    어떤걸 먹었을 때 얻은 타이틀을 어느쪽으로 배치하느냐에 따라 다음 먹을 수 있는 종류가 달라지는데, 어떻게 나누어 배치해서 어떤걸 먹느냐에 따라 얻을 수 있는 타이틀점수도 다르고 이후 상황도 계속 달라지니까요.

    3
    1 1 4
    4 8 2
    8 5 10
    간단하게 이런 경우는 앞에꺼만 정렬해서 순서대로 먹으면 마지막껀 못먹겠죠.

    5
    1 1 4
    4 8 2
    8 5 10
    1000 9 1
    8 1000 1
    그리고 이런 경우라면 중간에 획득한 타이틀점수를 배분까지 적절하게 잘 해야 다 먹을 수 있겠죠?
    이해하신게 맞긴 한데, 모든 음식점을 클리어 할 수 있는지 없는지 구하는게 아니라 클리어 할 수 있는 최대 음식점 수를 구하는거라서요.
    예를 드신 건 필요한 이해력&소화력이 너무 작고 타이틀점수는 너무 많이 주는 best input 이라서. 조금 더 worst input 을 생각해보시면 좋을듯요.

    어떤걸 먹었을 때 얻은 타이틀을 어느쪽으로 배치하느냐에 따라 다음 먹을 수 있는 종류가 달라지는데, 어떻게 나누어 배치해서 어떤걸 먹느냐에 따라 얻을 수 있는 타이틀점수도 다르고 이후 상황도 계속 달라지니까요.

    3
    1 1 4
    4 8 2
    8 5 10
    간단하게 이런 경우는 앞에꺼만 정렬해서 순서대로 먹으면 마지막껀 못먹겠죠.

    5
    1 1 4
    4 8 2
    8 5 10
    1000 9 1
    8 1000 1
    그리고 이런 경우라면 중간에 획득한 타이틀점수를 배분까지 적절하게 잘 해야 다 먹을 수 있겠죠?



    #include<stdio.h>
    #include<iostream>
    using namespace std;
    bool visit[100];
    int data[100][3];
    int result = 0;
    int n;
    void cal(int X, int Y, int cnt)
    {
        result = result > cnt ? result : cnt;
     
        int visit_t[100];
        for (int i = 0; i < n; i++) visit_t[i] = visit[i];
        bool change = false;
        int point = 0;
        for (int i = 0; i < n; i++){
            if (visit[i] == false){
                if (X >= data[i][0] || Y >= data[i][1]){
                    change = visit[i] = true;
                    point += data[i][2];
                    cnt++;
                }
            }
        }
     
        if (change){
            cal(X + point ,Y,cnt);
            cal(X,Y + point ,cnt);
        }
     
        for (int i = 0; i < n; i++) visit[i] = visit_t[i];
    }
    int main()
    {
        int T;
        scanf("%d",&T);
        for (int test = 1; test <= T; test++){
            result = 0;
            scanf("%d", &n);
            for (int i = 0; i < n; i++){
                scanf("%d %d %d", &data[i][0], &data[i][1], &data[i][2]);
            }
     
            cal(1,1,0);
     
            printf("#%d %d\n", test, result);
        }



반응형