inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

4 - A 재질문합니다

321

심재욱

작성한 질문수 9

0

http://boj.kr/cd6fbe132cfd4b3dbe5e0c746db37b16

실수로 공유를 안눌렀네요 ㅎㅎ..

질문했던 글 복붙해서 다시 올리겠습니다!

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

제가 찾아본 모든 반례 체크 다 통과했습니다.

아무래도 사전순 판단하는 로직때문에 틀린 것 같긴한데,,

ans 배열과 sel 배열을 비교해서 ans의 요소가 더 크면 break를 해주고 sel의 값으로 바꿔 주었는데 반례가 딱히 떠오르지 않으니까 답답합니다..

c++ 코딩-테스트 C++ 코테 준비 같이 해요!

답변 1

0

큰돌

안녕하세요 재욱님 ㅎㅎ

정말 잘 짜셨네요. ㅎㅎ

제가 주석 달아놨는데 참고 부탁드립니다.

#include <bits/stdc++.h>
using namespace std;


struct nut
{
    int a, b, c, d, e;
    
    nut(int a, int b, int c, int d, int e) : a(a), b(b), c(c), d(d), e(e) { }
    nut() { }
};

int n , m = 2100000000;

nut nu;
vector<nut> v;
vector<int> sel, ans;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    
    int a, b, c, d, e;
    cin >> n;
    
    cin >> nu.a >> nu.b >> nu.c >> nu.d;
    for (int i = 0; i < n; i++)
    {
        cin >> a >> b >> c >> d >> e;
        v.push_back(nut(a, b, c, d, e));
    }
    
    for (int i = 1; i < (1 << n); i++)
    {
        //굿.
        nut nutri(0, 0, 0, 0, 0);
        sel.clear();
        for (int j = 0; j < n; j++)
        {
            if (i & (1 << j))sel.push_back(j);
        }
        
        for (int idx : sel){
            nutri.a += v[idx].a;
            nutri.b += v[idx].b;
            nutri.c += v[idx].c;
            nutri.d += v[idx].d;
            nutri.e += v[idx].e;
        } 

        if (nutri.a >= nu.a && nutri.b >= nu.b && nutri.c >= nu.c && nutri.d >= nu.d)
        {  
            if (m > nutri.e){    
                m = nutri.e;
                ans.clear();
                // 제가 j를 idx로 바꾼 이유는요. 이코드는 j여도 문제가 없어요.
                // 그치만 변수명 같은 경우 이렇게 j를 순회하면서 sel에다가 push하는 로직을 하고 여기서는 
                // sel의 요소를 넣을 때 j를 또 쓰잖아요. 이렇게 됬을 때 나중에 헷갈릴 수가 있어서 맞왜틀에 빠질 수 있거든요. 
                // 넉넉히 변수명 하나 더 씁시다.
                for (int idx : sel) ans.push_back(idx + 1);
            } // 굿. 
            else if (m == nutri.e){
                bool flag = false; 
                // 이부분!
                // ans 1 2 3 4
                // sel 1 2 3 인 경우가 반례입니다. 
                int size = min(ans.size(), sel.size());
                
                for (int j = 0; j < size; j++)
                {
                    if (ans[j] > sel[j] + 1){
                        flag = true;
                        break;
                    }
                }
                
                if (flag) {
                    ans.clear();
                    for (int idx : sel) ans.push_back(idx + 1);
                }
            }
        }
    
    }
    
    if (m == 2100000000) m = -1;
    //endl은 쓰지 말아주세요 - 교안 참고
    cout << m << endl; 
    cout << ba[0];
    if(m != -1){
        for (int i = 0; i < ans.size(); i++) cout << ans[i] << " ";
        cout << '\n'; 
    } 
}
 또 질문 있으시면 언제든지 질문 부탁드립니다.

좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)

감사합니다.

강사 큰돌 올림.

0

심재욱

강사님 좋은 답변 너무 감사드립니다!!

제가 생각한게 비트마스킹으로 모든 경우의 수를 탐색 할 때는 1 2 3 4가 1 2 3보다 뒤에 탐색 되기 때문에 애초에 ans가 1 2 3 4일 때 sel이 1 2 3 이 될 경우가 없어서 괜찮다고 생각하는데 이게 아닌건가요?..

0

큰돌

재욱님 안녕하세요 ㅎㅎ 그 말씀이 맞습니다. 1, 2, 3 .... 1, 2, 3, 4이렇게 되서

사실 그 반례가 적용될 코드는 아니긴 하네요.. 흠....

이부분은 제가 시간날 때 다시한번 생각해볼게요.

5-B

0

17

2

4 - A

0

33

2

코딩살구클럽 입장이 안됩니다

0

82

2

4-F 경우의 수 질문입니다.

0

35

2

코딩살구클럽 가입이 안됩니다.

0

85

2

살구 클럽에 대한 질문있습ㄴ디ㅏ

0

63

1

교안 158페이지 문의드립니다

0

47

2

코딩살구클럽 관련 건의사항

0

119

1

코살에 19942 다이어트 문제에 N의 범위가 빠져있슴니다

0

45

1

진행 방법 질문드립니다!

0

83

2

2-I) 왜 이 문제가 그래프이론 카테고리에 있는지 잘 모르겠습니다.

0

64

2

2주차 개념#12 트리 순회

0

33

2

백준사이트가 종료된다고 합니다.

0

318

2

백준 서비스 종료

9

953

1

sk 하이닉스 코테 대비

0

388

2

3-G 최댓값 질문

0

54

1

모듈러 연산 값이 10이 아닌 경우도 있지 않나요?

0

84

2

3-I 코드 질문드립니다.

0

66

2

3-N 질문 있습니다.

0

68

2

학습방법

0

105

2

4-H 질문 있습니다 (코드 리뷰)

0

69

2

코딩테스트 어디까지 준비해야 하는지 질문이 있습니다.

0

186

2

2-O 반례가 무엇일지 어떤 부분이 틀렸는지 잘 모르겠습니다.

0

74

2

2주차 개념 #4-2. 인접행렬 질문있습니다.

0

66

2