반응형
rolypolytoy
현's story
rolypolytoy
전체 방문자
오늘
어제
  • 분류 전체보기
    • 현's tory
      • 여행
      • 개인사업
      • 컨프런스
      • 채용지원
    • Vision AI | 3D Graphics
      • Vision AI
      • OpenGL
    • 프로그래밍 언어
      • C++
      • Python
    • Computer Science
      • 운영체제
    • 알고리즘
      • 백준
      • 프로그래머스
      • 개념정리
    • 유용한 링크
      • 개발

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준13397
  • 백준사회망서비스
  • 백준
  • 다이나믹프로그래밍
  • EffectiveC++
  • c++
  • IOS
  • 백준2533
  • PlantUML
  • DFS조합
  • 알고리즘
  • 디자인패턴
  • 백준문제풀이
  • 백준다이나믹
  • 프로그래머스실패율
  • 백준1756
  • iOS비동기
  • 백준2169
  • 백준17471
  • iOSMetal
  • 사회망서비스
  • 백준이분탐색
  • 알고리즘구현
  • vscodeopengl
  • 상표특허출원
  • openglvscode
  • 아키텍처패턴
  • 백준알고리즘
  • sync
  • 백준2302

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
rolypolytoy

현's story

[백준 16987] 계란으로 계란치기 C++
알고리즘/백준

[백준 16987] 계란으로 계란치기 C++

2020. 7. 31. 20:55
반응형

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

 

16987번: 계란으로 계란치기

원래 프로그래머의 기본 소양은 팔굽혀펴기를 단 한 개도 할 수 없는 것이라고 하지만 인범이는 3대 500을 넘기는 몇 안되는 프로그래머 중 한 명이다. 인범이는 BOJ에서 틀린 제출을 할 때마다 턱

www.acmicpc.net

문제풀이

 

계란으로 계란치기 문제의 경우, 글을 해석하느라 시간이 조금 오래걸렸습니다. 

 

생각 보다 문제에 도움이 안되는 말이 앞에 주절주절이 있고, 중간 설명하는 부분에 중요 포인트가 많은데

처음 읽었을 때 확실하게 안와닿는 부분이 많았습니다. 

 

먼저, 문제에서 말한대로 계란의 정보를 가져오는데,

저는 struct로 대입했습니다. (뭔가 구조안에 넣어서 체계적으로 만들고 싶은 생각?)

 

struct 안에는 power라는 내구성에 대한 변수가 있고, 상대 계란을 깰 때 사용하는 weight의 변수도 있습니다.

이 struct를 변수화 시켜서

typedef를 사용하여 egg라는 구조체를 배열로 만들었습니다.

 

문제에서 나온대로, '손에 든 계란이 깨졌거나, 깨지지 않은 다른 계란이 없으면 치지 않고 넘어간다' 라는 조건에서 

if (eggs[dep].power <= 0) return dfs(dep + 1);

위의 코드와 함께,

	bool None_FLAG = false;



	for (int j = 0; j < n; j++) {
		int i = dep;

		if (i == j) continue;

		if (eggs[j].power > 0) {
			None_FLAG = true;

			
			eggs[i].power -= eggs[j].weight;
			eggs[j].power -= eggs[i].weight;

			dfs(dep + 1);

			eggs[i].power += eggs[j].weight;
			eggs[j].power += eggs[i].weight;
		}



	}

	if (!None_FLAG) return dfs(dep + 1);

FLAG를 선언하여 한번이라도 내구성이 양인 값을 찾지 못하면 다음 인덱스로 넘어가게 설정했습니다.

 

위에 코드를 보면, None_FLAG = false가 되어있는데, for 문을 다 돌렸음에도 불구하고 None_FLAG = true안에 못들어가게 되면, 

 

	if (!None_FLAG) return dfs(dep + 1);

위 코드를 선언해주어 다음 index에 넘어가도록 만들었습니다.

 

이렇게 코드를 짜면, 문제에서 말한 '손에 든 계란이 깨졌거나, 깨지지 않은 다른 계란이 없으면 치지 않고 넘어간다' 조건에 충족시킬 수 있습니다.

 

전체 코드는 아래와 같습니다.

#include <iostream>
#include <algorithm>

using namespace std;

#define input_max 8 + 1

typedef struct egg{
	int power;
	int weight;
} Eggs;

int n;
int result;


Eggs eggs[input_max];

void dfs(int dep) {

	if (dep == n) {

		
		int sum = 0;

		for (int i = 0; i < n; i++) {
			if (eggs[i].power <= 0) sum++;
		}

		result = max(result, sum);

		return;
	}

	if (eggs[dep].power <= 0) return dfs(dep + 1);



	bool None_FLAG = false;



	for (int j = 0; j < n; j++) {
		int i = dep;

		if (i == j) continue;

		if (eggs[j].power > 0) {
			None_FLAG = true;

			
			eggs[i].power -= eggs[j].weight;
			eggs[j].power -= eggs[i].weight;

			dfs(dep + 1);

			eggs[i].power += eggs[j].weight;
			eggs[j].power += eggs[i].weight;
		}



	}

	if (!None_FLAG) return dfs(dep + 1);
		
}


void solution() {

	cin >> n;

	for (int q = 0; q < n; q++) {
		cin >> eggs[q].power;
		cin >> eggs[q].weight;
	}


	dfs(0);

	

	cout << result << '\n';
	
}
int main() {

	ios_base::sync_with_stdio(0);

	cin.tie(0);
	cout.tie(0);
	
	solution();

	return 0;
}

반응형
저작자표시 비영리 변경금지

'알고리즘 > 백준' 카테고리의 다른 글

[백준 17090] 미로 탈출하기 C++  (0) 2020.08.10
[백준 12931] 두 배 더하기 C++  (0) 2020.08.04
[백준 17069] 파이프 옮기기 2 C++ (Bottom-up 방식)  (0) 2020.07.31
[백준 17069] 파이프 옮기기 2 C++ (Top-down 방식)  (0) 2020.07.31
[백준 17070] 파이프 옮기기 1 C++  (0) 2020.07.31
    '알고리즘/백준' 카테고리의 다른 글
    • [백준 17090] 미로 탈출하기 C++
    • [백준 12931] 두 배 더하기 C++
    • [백준 17069] 파이프 옮기기 2 C++ (Bottom-up 방식)
    • [백준 17069] 파이프 옮기기 2 C++ (Top-down 방식)
    rolypolytoy
    rolypolytoy

    티스토리툴바