강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

staktree님의 프로필 이미지
staktree

작성한 질문수

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

4 - F 1062번 가르침, 가르침이 필요합니다!

해결된 질문

작성

·

297

0

안녕하시렵니까?

강의 재미있게 듣고 있습니다. 선생님 강의를 수강하고, 백준 잔디 채우는 일에 빠져 열심히 문제를 풀고 있네요!

하지만, 4주차 F번째인 1062번째 가르침에서 고난을 마주하게 되었습니다ㅠㅠ

선생님의 해설 강의를 보고 로직은 이해한거 같은데, 저의 방식대로 풀어보려하니 도무지 어디가 틀린 것인지 모르겠습니다.

http://boj.kr/f915fd53647443ee9dac1ff8741a5b5d

문제의 조건 중 a, n, t, i, c가 무조건 포함되기 때문에, 이를 제외하고 나온 알파벳의 모든 경우의 수를 체크하여 문제를 풀면 조건 시간 내에 해결할 수 있지 않을까하는 아이디어로 문제를 풀어보았습니다. 계속 고민을 해보아도 어떤 반례가 있는지 도무지 생각이 안나 이렇게 질문을 올리게 되었습니다.

바쁘시겠지만 한번 봐주시면 큰 도움이 될 듯합니다!!

답변 1

1

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요. ㅎㅎ 해당 부분 주석달았습니다. 확인하세욥.

words[i] : 비트마스킹 조합이 담김.

checkingAlpabat : 등장한 알파벳 전부 - 비트

alpabat : 등장한 알파벳 : 문자

for(int i = 1; i < (int)pow(2, alpabat.size()); i++)

- 등장한 알파벳을 기반으로 비트마스킹 조회

word |= (1 << (alpabat[j] - 'a'));

- word에는 글자가 담김. 순서 x

 

if(oneCnt != K - 5) // K - 5개를 뽑은 경우만 체크합니다.

continue;

- 왜 굳이? / 이부분 왜 체크하나요?

if((words[j] & word) == words[j]) cnt++;

- 굳

감사합니다.

staktree님의 프로필 이미지
staktree
질문자

답변 주셔서 감사합니다!

문제의 조건이 'a', 't', 'n', 'c', 'i'를 무조건 배워야하는 문자에 포함시켜야하기 때문에, 비트의 개수인 oneCount가 K-5인 경우만 체크하도록 하였습니다.

if(oneCnt != K - 5) // K - 5개를 뽑은 경우만 체크합니다.

continue;

- 왜 굳이? / 이부분 왜 체크하나요?

>> 배울 수 있는 글자의 수보다 더 적게 뽑힌 경우 또는 많이 뽑힌 경우를 제외하기 위해서 추가했습니다.

K : 7,

모든 남극 문자에서 나온 글자의 수 : 10

이 상황에서 K는 'a', 't', 'n', 'c', 'i'을 무조건 배워야하기 때문에 이를 제외하면 2개(K-5)를 배울 수 있습니다.

alpabat 벡터에는 'a', 't', 'n', 'c', 'i'을 제외한 5개의 문자가 들어가게됩니다.

=> 5개 중에 2개를 뽑는 경우의 수를 체크하여, 읽을 수 있는 남극 문자의 수를 구합니다.

=> alpabat.size()에서 K - 5개를 뽑는 경우의 수를 체크하여, 읽을 수 있는 남극 문자의 수를 구합니다.

이렇게 생각했습니다!

 

for(int i = 1; i < (int)pow(2, alpabat.size()); i++) // alpabat으로 만들 수 있는 모든 조합을 체크합니다.
{                                                    // alpabat.size()가 5라면, 00001 ~ 11111을 체크합니다.
     int oneCnt = 0; // 1인 비트의 개수
     int cnt = 0; // 각 경우의 읽을 수 있는 남극 문자의 개수 
     int word = 0; // i번째 경우의 수의 읽을 수 있는 글자를 비트로 표현한 것

     for(int j = 0; j < alpabat.size(); j++) // 각 비트를 체크합니다.
     {
         if(i & (1 << j)) // 해당 비트가 1이라면?
         {
             word |= (1 << (alpabat[j] - 'a')); // alpabat의 j 인덱스에 저장된 글자를 word에 저장합니다.
             oneCnt++; // 나온 1의 개수를 증가시킵니다.
             if(oneCnt > K - 5) // oneCnt가 배울 수 있는 글자의 수를 초과하면 break합니다.
                 break;
         }
     }
        
     if(oneCnt != K - 5) // K - 5개를 뽑은 경우만 체크합니다.배울 수 있는 글자의 수보다 적게 배우거나 많이 배운 경우를 제외합니다.
        continue;
        ---생략---
}
staktree님의 프로필 이미지
staktree

작성한 질문수

질문하기