강의

멘토링

로드맵

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

Jh P님의 프로필 이미지
Jh P

작성한 질문수

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

4-F

4-F 코드비교

해결된 질문

작성

·

26

0

강사님 안녕하십니까!
수업 너무 재밌게 잘 듣고 있습니다.

4-F를 풀어보고 강사님 코드와 비교했을때 강사님 코드가 짧고 간결해 보입니다.

우선 제가 한 풀이는 비트마스킹으로 반드시 배워야할 단어 갯수 5개를 제외하고 나머지 단어들은 조합으로 고르고 나서 그 조합을 바탕으로 하나씩 대입해보는 구조로 로직을 구현했습니다.

저는 문제를 풀때 실력이 부족하여 묶어서 한번에 구현하는게 어렵게 느껴집니다. 그래서 이렇게 단계별로 로직을 짜서 중간에 테스트하면서 완성합니다. 허나 이렇게 풀이를 하였을 때 강사님 코드와 비교하면 항상 조금 더 코드가 길거나 복잡한 감이 있습니다.
우선 지금 문제를 제가 푼 풀이 방법으로 했을 때 문제점이 있을까요? 문제점이 없어도 강사님 코드처럼 간결하게 짜는 연습이 중요할까요? 코드 한번 봐주시고 평가해주시면 정말 감사하겠습니다!
http://boj.kr/e82932716dc04cf2804eba50bd7a2aa6

 

추가로 한달 전까지만 해도 자료구조, 알고리즘을 기초도 제대로 못 갖췄는데 항상 좋은 강의와 답변을 해주셔서 실력이 늘고 있습니다 중간 중간 풀이 팁들을 적용할때 마다 매번 감사함을 느낍니다 ㅎㅎ
그럼 좋은 하루 보내시길 바랍니다!

답변 1

0

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

안녕하세요 ㅎㅎ

코드 잘 짜셨네요 ㅎㅎ

저처럼 간결하게 짜는 것은 그렇게 중요하지 않습니다.

정확하고 효율적으로 짜는게 중요한데요 수강생님 코드는 그러한 코드인 것 같습니다.

void combi(int start, vector<int> &b){
	if(b.size() == k-5){

k-5로 한 것 너무 좋습니다.

 

int solve(vector<int> b){
	int cnt = 0;
	int ret = (1 << 0) + (1 << 2) + (1 << 8) + (1 << 13) + (1<<19);
	for(int i : b) ret|=(1 << i);
	
	for(int i = 0; i < n; i++){
		if( (ret | a[i]) <= ret) cnt ++;
	}
	return cnt;
}

solve 부분에서 비트연산자를 통해서 ret에 합집합을 만들고 카운팅 로직을 넣은 점. 훌륭합니다.

다만 저기서 b의 경우 다른 문제의 경우 더 많은 요소들을 가지고 있다면 -> &b로 넘기는게 더 효율적입니다.

이부분은 교안내의 다음 부분 참고부탁드립니다.

스크린샷 2025-08-09 오후 12.20.45.png.webp

 

 

우선 지금 문제를 제가 푼 풀이 방법으로 했을 때 문제점이 있을까요? 문제점이 없어도 강사님 코드처럼 간결하게 짜는 연습이 중요할까요?

-> 문제점은 없습니다. 그냥 저의 코드라는 해결방안이 하나 더 있구나 생각하시면 됩니다.

combi() 의 경우 비트마스킹으로 하면 더 간결하게 할 수 있구나 하면서 현재 코드에서 -> for문을 사용한 비트마스킹으로 연습 2번정도만 하시면 될 것 같습니다.

 

그럼 좋은 하루 보내시길 바랍니다!

-> 도움이 되셨다니 저도 마음이 좋네요 ㅎㅎ 수강생님도 좋은 주말보내세요~

 


 

또 질문 있으시면 언제든지 질문 부탁드립니다.

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

감사합니다.

강사 큰돌 올림.

Jh P님의 프로필 이미지
Jh P

작성한 질문수

질문하기