※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 13910번 문제인 개업이다.
문제는 아래 링크를 확인하자.

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

 

13910번: 개업

해빈이는 짜장면을 정말 좋아한다. 짜장면을 너무 좋아한 나머지 짜장면만 파는 중국집을 개업했다! 해빈이는 양손잡이여서 동시에 두 개의 웍(중국 냄비)을 사용하여 요리할 수 있다. 그러나

www.acmicpc.net

문제의 상황을 그래프로 모델링해보자. 먼저, k인분을 만든 상황을 노드 k라 하자. 그리고 현재 p인분의 요리를 만들었을 때 한번의 추가 조리를 거쳐 총 q인분을 완성시킬 수 있는 관계를 노드p에서 q로 향하는 에지로 나타내자. 이 때, 주어진 문제는 노드0에서 노드N까지의 최단거리를 구하는 문제로 생각할 수 있다. 이는 BFS를 이용해 간단히 구해낼 수 있다.

 

요리는 한번에 한 개의 웍 또는 두 개의 웍으로 진행할 수 있으므로, 한 번의 요리에 만들 수 있는 요리의 양을 먼저 전처리해두자.

 

아래는 제출한 소스코드이다.

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int N, M;
int onedish[100];
bool dishes[10001];
vector<int> vec;

int dist[10001];

void bfs() {
	dist[0] = 1;
	queue<int> que;
	que.push(0);
	while (!que.empty()) {
		int cur = que.front(); que.pop();
		for (auto& x : vec) {
			int nxt = cur + x;
			if (nxt > N || dist[nxt]) continue;
			dist[nxt] = dist[cur] + 1;
			que.push(nxt);
		}
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> N >> M;
	for (int i = 0; i < M; i++) cin >> onedish[i];
	for (int i = 0; i < M; i++) {
		dishes[onedish[i]] = 1;
		for (int j = i + 1; j < M; j++) {
			int tmp = onedish[i] + onedish[j];
			if (tmp <= N) dishes[tmp] = 1;
		}
	}

	for (int i = 1; i <= N; i++) {
		if (dishes[i]) vec.emplace_back(i);
	}

	bfs();

	cout << dist[N] - 1;
}

 

728x90

'BOJ' 카테고리의 다른 글

[BOJ 13911 // C++] 집 구하기  (0) 2023.03.25
[BOJ 13903 // C++] 출근  (0) 2023.03.24
[BOJ 13909 // C++] 창문 닫기  (0) 2023.03.22
[BOJ 13908 // C++] 비밀번호  (0) 2023.03.21
[BOJ 25938 // C++] Towers of Hanoi Grid  (0) 2023.03.20

+ Recent posts