반응형

 

[광고 누르면 오늘의 행운 상승!!]

 

https://www.acmicpc.net/problem/16987

 

16987번: 계란으로 계란치기

원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱걸이를 5회 하는 기적의 운동 루틴을 통해 뇌와 근육을 동시에 단련한다. 근육을 단련할 때 식단이 정말로 중요하다는 것을 아는 인범이는 탄수화물이 많은 밥이나 빵 따위의 아침 식사를 대신해 단백질이 많은 계란찜을 해먹는다. 계란찜을 먹기 위해서는 계란을 깨야 하

www.acmicpc.net

1. 처음 해보는 DFS유형의 문제

2. EGG배열을 만들어서 내구도, 무게, 깨졌는지 여부, 최근 계란, 깨진 수 를 저장한다.

3. DFS를 돌면서 가장 왼쪽부터 계란을 깬다. 

4. 만약 손에 든 계란이 깨졌다면 다음 계란으로 넘어간다.

5. 다음 계란도 깨져있다면 그 다음 계란으로 넘어간다.

6. DFS를 돌고 난 후 다시 복구 해 준다(다음 케이스에서 사용해야 하므로)

 

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

class Egg{
	int hard, weight, current, cnt;
	boolean isbreak;
	public Egg(int hard, int weight, boolean isbreak,int current, int cnt) {
		this.hard = hard;
		this.weight = weight;
		this.isbreak = isbreak;
		this.current = current;
		this.cnt = cnt;
	}
}
public class 계란으로계란치기 {
	public static Egg[] eggs;
	public static int N,ans=Integer.MIN_VALUE;
	public static void main(String[] args) throws Exception{
		System.setIn(new FileInputStream("test.txt"));
		Scanner sc = new Scanner(System.in);

		N = sc.nextInt();
	
		eggs = new Egg[N];
		for (int i = 0; i < N; i++) {
			eggs[i] = new Egg(sc.nextInt(), sc.nextInt(),false,0,0);
		}
		
		dfs(0,0);
		if(ans == Integer.MIN_VALUE) System.out.println(0);
		else System.out.println(ans);
	}
	public static void dfs(int idx, int cnt) {
		//가장 오른쪽 계란에 도달
		if(idx == N) return;
		
		Egg egg = eggs[idx];
		if(egg.isbreak) {
			//계란이 깨졌으면 다음 계란으로 넘김
			dfs(idx+1, cnt);
			return;
		}
		for (int i = 0; i < N; i++) {
			int temp = 0;
			//같은 계란
			if(idx == i) continue;
			//깨진 계란
			if(eggs[i].isbreak) continue;
			
			//계란 계산
			egg.hard -= eggs[i].weight;
			eggs[i].hard -= egg.weight;
			
			if(egg.hard <= 0) {
				egg.isbreak = true;
				temp++;
			}
			if(eggs[i].hard <= 0) {
				eggs[i].isbreak = true;
				temp++;
			}
			//최대 갱신
			ans = Math.max(cnt + temp, ans);
			//dfs 시작
			dfs(idx + 1,cnt+temp);
			
			//원상복구
			if(egg.hard <= 0) {
				egg.isbreak = false;
			}
			if(eggs[i].hard <= 0) {
				eggs[i].isbreak = false;
			}
			
			egg.hard += eggs[i].weight;
			eggs[i].hard += egg.weight;
		}
	}
}
반응형

+ Recent posts