https://www.acmicpc.net/problem/16987
문제를 통해 한쪽 방향으로 쭉 진행되는 것을 알 수 있음
import java.io.*;
import java.util.*;
public class Main {
static int N;
static int[] S;
static int[] W;
static int ans = 0;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
S = new int[N];
W = new int[N];
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
S[i] = Integer.parseInt(st.nextToken()); // 내구도
W[i] = Integer.parseInt(st.nextToken()); // 무게
}
dfs(0);
System.out.println(ans);
}
private static void dfs(int idx) {
//종료
if(idx == N) {
int cnt = 0;
for (int i = 0; i < N; i++) {
if (S[i] <= 0) {
cnt++;
}
}
ans = Math.max(ans, cnt);
return;
}
//확장
if (S[idx] <= 0) { // 손에 들 계란이 부셔졌으면 다음거
dfs(idx + 1);
return;
}
boolean canHit = false;
for (int i = 0; i < N; i++) {
if (i == idx || S[i] <= 0) {
continue;
}
canHit = true;
S[idx] -= W[i];
S[i] -= W[idx];
dfs(idx + 1);
S[idx] += W[i];
S[i] += W[idx];
}
if (!canHit) { // 더이상 칠것이 없어도 다음거
dfs(idx + 1);
}
}
}
if (S[idx] <= 0) { // 손에 들 계란이 부셔졌으면 다음거
dfs(idx + 1);
return;
}
🤔 return; 을 사용하지 않으면, 현재 공이 부서진 상태임에도 불구하고 for 루프를 통해 다른 공과의 충돌 시뮬레이션을 계속 수행하게 된다!
그럼 아래에도 return??
if (!canHit) {
dfs(idx + 1);
}