인프런 커뮤니티 질문&답변
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++;
- 굳
감사합니다.






답변 주셔서 감사합니다!
문제의 조건이 '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개를 뽑는 경우의 수를 체크하여, 읽을 수 있는 남극 문자의 수를 구합니다.
이렇게 생각했습니다!