Koder / 박성훈
article thumbnail

변수초기화를생활화하자!

변수초기화를생활화하자!

변수초기화를생활화하자!

 

ㅠㅠㅠㅠ

 

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

 

12869번: 뮤탈리스크

1, 3, 2 순서대로 공격을 하면, 남은 체력은 (12-9, 10-1, 4-3) = (3, 9, 1)이다. 2, 1, 3 순서대로 공격을 하면, 남은 체력은 (0, 0, 0)이다.

www.acmicpc.net

수의 범위가 크지 않아서 DP배열을 선언하기 그리 어렵지 않다.

DP배열을 선언해두고 dfs나 bfs 등의 방법으로 가능한 가짓수

여섯가지 경우에 대해 탐색을 해주면 되는데,

 

탐색 중간에 SCV의 체력이 음수로 내려가는경우 음수 인덱스에 접근하게 되면서

세그폴트가 발생할 수 있으므로, k = max(k,0) 등의 구문을 통해서

음수 인덱스에 접근하지 않도록 값을 조정해주면 된다.

 

나는정작 저부분 다 고민해놓고

입력으로 들어오는 a, b, c 를 초기화 안해놔서 맞왜틀

이런실수좀줄여야할텐데 ㅠㅠ

 

#include <bits/stdc++.h>
using namespace std;

int dp[99][99][99];

int find(int a, int b, int c){
	a = max(a,0);
	b = max(b,0);
	c = max(c,0);
	
	if(dp[a][b][c] != -1) return dp[a][b][c];
	
	return dp[a][b][c] = min({
		find(a-9,b-3,c-1)+1,
		find(a-9,b-1,c-3)+1,
		find(a-3,b-9,c-1)+1,
		find(a-3,b-1,c-9)+1,
		find(a-1,b-3,c-9)+1,
		find(a-1,b-9,c-3)+1
	});
}

int main(){
	memset(dp, -1, sizeof(dp));
	dp[0][0][0] = 0;
	
	int N,arr[3] = {0};
	
	cin >> N;
	for(int i=0; i<N; i++) cin >> arr[i];
	
	cout << find(arr[0],arr[1],arr[2]);
	return 0;
}

개인적으로 깔끔하게 짜낸것 같아서 맘에 든다.

반응형