inflearn logo
강의

Course

Instructor

Coding Test Practice Test (with C++): For Large Companies

5. Solution to the maximum preferred food problem (DFS, bitmask)

최대 선호 음식 질문드립니다.

217

xogh7532

13 asked

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

제출하니까 시간초과가 뜹니다. 어디가 잘 못 된건가요??

import java.io.*;
import java.util.*;

public class Main {
	public static int[] pow, st;
	public static int n,d,k,answer=Integer.MIN_VALUE;
	public static void main(String[] argvs) {
		Scanner sc = new Scanner(System.in);
		
		n=sc.nextInt();
		d=sc.nextInt();
		k=sc.nextInt();
		pow = new int[d+1];
		st = new int[n+1];
		pow[1]=1;
		for(int i=2; i<=d; i++) pow[i] = pow[i-1]*2;
		
		for(int i=1; i<=n; i++) {
			int num, m;
			m=sc.nextInt();
			for(int j=0; j<m; j++) {
				num=sc.nextInt();
				st[i] += pow[num];
			}
		}
		dfs(0,0,0);
		System.out.print(answer);
	}
	public static void dfs(int L, int s, int bit) {
		if(L==k) {
			int cnt=0;
			for(int i=1; i<=n; i++) 
				if((bit&st[i])==st[i])cnt++; //st[i]가 bit의 부분집합이라면 cnt증가
			answer = Math.max(answer, cnt); //최대값 갱신
		}
		else {
			for(int i=s; i<d; i++) { //조합으로 탐색
				dfs(L+1, i+1, bit+pow[i]);
			}
		}
	}
}

c++ 코딩-테스트

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

xogh7532님, 제출하신 코드에서 시간 초과 문제가 발생하는 주된 원인은 반복적인 DFS 호출과 큰 입력 사이즈에서 비효율적인 비트마스킹 연산 때문으로 보입니다. 이를 해결하기 위해 몇 가지 방법을 제안드립니다.

  1. 비트 연산 최적화: 현재 코드는 DFS를 통해 모든 가능한 조합을 생성하며, 각 조합에 대해 전체 st[] 배열을 순회하여 조건을 만족하는지 검사합니다. 비트 연산 부분은 최적화가 필요 없어 보이지만, 조합을 생성하는 과정에서 for 문이 d의 크기만큼 반복되기 때문에 이 부분에서의 최적화가 필요할 수 있습니다.

  2. 탐색 범위 축소: dfs 함수에서 for 문이 사용되어 d까지 모든 가능한 조합을 탐색하고 있습니다. 하지만, 실제로 필요한 조합만을 탐색하도록 탐색 범위를 축소할 수 있다면 시간을 단축시킬 수 있습니다. 예를 들어, 이미 선택한 요소와 연관 없는 요소는 탐색에서 제외할 수 있습니다.

  3. 빠른 입출력 사용: 자바의 경우 ScannerSystem.out.print 대신 BufferedReaderBufferedWriter를 사용하면 입출력에서 시간을 단축시킬 수 있습니다. 대량의 데이터를 처리할 때는 이 방법이 효율적입니다.

구체적으로, 수업 관련 질문에 대한 자세한 답변은 수업의 Q&A 섹션 혹은 강사님께 직접 문의해보시는 것도 좋은 방법입니다.

수업의 핵심 포인트를 잘 파악하고, 필요한 지식을 바탕으로 문제를 해결하는 과정에서 더 많이 배울 수 있습니다. 계속해서 도전하는 자세가 중요합니다.

원하는 답변을 찾지 못하셨나요?
그럼 우측 하단의 ‘문의하기’ 에서 직접 문의해주세요. 최대한 빠르게 답변드리도록 하겠습니다!

바둑돌에 조합을 구하는 dfs는 설명이 어딨나요

0

96

1

알고리즘이라.. 강의 설명때 모식도가 있으면 더좋겠어요

0

160

1

BFS 코드 중에 이해가 안되는 부분이 있습니다.

0

219

1

호텔 연결 질문드립니다.

0

157

1

숨겨진 합 질문드립니다.

0

150

1

제품이동 질문드립니다.

0

126

1

송아지 찾기2 질문드립니다.

0

125

1

정사각형 그리기 질문드립니다.

0

142

1

호텔연결

0

143

1

중복된 문자 제거 코드

0

215

1

전투게임

0

168

1

숲속의 기사

0

131

1

멀티태스킹 질문드립니다.

0

194

1

숨겨진 합 자바 질문드립니다.

0

135

1

영화관람 시간초과 질문드립니다.

0

192

1

[2-5] 최대선호음식 시간초과..

0

263

1

dp 풀이는 어려운가요?

0

399

2

문제 의문

0

296

2

모의고사 7회 2번 송아지 찾기 테스트케이스 3번, 4번 오류

0

313

1

안녕하세요. 궁금한점이 있어서 질문드립니다.

0

244

1

BFS 참고하세요

0

265

1

#include<bits/stdc++.h>

0

761

1

잔디 문제 해설 c로 바꿔서 출력할 때

1

374

1

조합을 구할때 algorithm 함수 next_permutation 사용 가능 여부

0

459

1