반응형
백준 계란으로 계란치기
https://www.acmicpc.net/problem/16987
16987번: 계란으로 계란치기
원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱
www.acmicpc.net
백준 골드5 계란으로 계란치기
접근 방식
Egg 클래스를 선언해서 왼쪽부터 순서대로 들어서 해결
모든 경우의 수를 탐색해야 하기에, 백트래킹으로 진행
구현 방법
- Egg클래스
- isBroken : 깨져있는지 확인
- breakEgg : 대상이 깨져있는지 확인 후 공격
- attackEgg : 서로 공격
- 깊은 복사를 위한 deepCopy 메서드
- 백트래킹
⇒
알을 꺼내는 방식은 순차적
꺼낸 알을 갖고 모든 알들에 시도해보기 (모든 경우의 수 탐색)
이후 최종 깊이에 도달하면 Egg의 깨져있는 수를 카운트
풀이
package Baekjoon.gold;
import java.io.*;
import java.util.*;
public class p16987 {
static int n;
static int max = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
ArrayList<Egg> eggList = new ArrayList<>();
StringTokenizer st;
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
eggList.add(
new Egg(
Integer.parseInt(st.nextToken()),
Integer.parseInt(st.nextToken())
)
);
}
if (n == 1) {
System.out.println(0);
return;
}
boolean[] visited = new boolean[n];
dfs(eggList, 0, 0);
System.out.println(max);
}
public static void dfs(List<Egg> prevEggList, int index, int depth) {
if (depth == n) {
//전체 브로큰 횟수 출력
max = Integer.max(brokenCount(prevEggList), max);
return;
}
for (int i = 0; i < n; i++) {
List<Egg> nowEggList = deepCopy(prevEggList);
Egg nowEgg = nowEggList.get(depth);
if (i != depth) {
nowEgg.breakEgg(nowEggList.get(i));
dfs(nowEggList, 0, depth + 1);
}
}
}
static int brokenCount(List<Egg> eggList) {
int count = 0;
for (int i = 0; i < n; i++) {
if (eggList.get(i).isBroken()) {
count++;
}
}
return count;
}
static class Egg {
int durability;
int weight;
Egg(int durability, int weight) {
this.durability = durability;
this.weight = weight;
}
public void breakEgg(Egg egg) {
if (!egg.isBroken() && !this.isBroken()) {
attackEgg(egg);
}
}
private void attackEgg(Egg egg) {
int a = this.weight;
int b = egg.weight;
this.durability -= b;
egg.durability -= a;
}
private boolean isBroken() {
if (durability <= 0) {
return true;
}
return false;
}
}
public static List<Egg> deepCopy(List<Egg> eggList) {
ArrayList<Egg> tempList = new ArrayList<>();
for (int i = 0; i < eggList.size(); i++) {
Egg temp = eggList.get(i);
tempList.add(new Egg(temp.durability, temp.weight));
}
return tempList;
}
}
후기
문제 구현이 생각보다 어려웠는데 이유를 모르겠음…
굳이 이유를 꼽자면 Egg의 상태를 확인해줄 때 헷갈렸던 것 같다.
속도는 클래스를 활용해서 그런지 상당히 느림 매번 깨져있는지 확인하면서 더 돌아서 느린듯?
반응형
'공부 > Algorithm' 카테고리의 다른 글
백준 1038, 1174 감소하는 수(줄어드는 수) 자바로 풀어 본 짧은 글 (1) | 2025.01.29 |
---|---|
백준 25916 싫은데요 자바로 풀어 본 짧은 글 (1) | 2023.12.21 |
백준 2866 문자열 잘라내기 자바로 풀어 본 짧은 글 (2) | 2023.12.08 |
백준 2805 나무 자르기 자바로 풀어 본 짧은 글 (2) | 2023.12.03 |
백준 16401 과자 나눠주기 자바로 풀어 본 짧은 글 (0) | 2023.12.02 |