DY N DY
실력키우기 장난감조립(C++) 본문
1021 : 장난감조립
제한시간: 1000 ms 메모리제한: 32 MB
해결횟수: 558 회 시도횟수: 1595 회
우리는 어떤 장난감을 여러 가지 부품으로 조립하여 만들려고 한다. 이 장난감을 만드는데는 기본 부품과 그 기본 부품으로 조립하여 만든 중간 부품이 사용된다. 기본 부품은 다른 부품을 사용하여 조립될수 없는 부품이다. 중간 부품은 또 다른 중간 부품이나 기본 부품을 이용하여 만들어지는 부품이다.
예를 들어보자. 기본 부품으로서 1, 2, 3, 4가 있다. 중간 부품 5는 2개의 기본 부품 1과 2개의 기본 부품 2로 만들어진다. 그리고 중간 부품 6은 2개의 중간 부품 5, 3개의 기본 부품 3과 4개의 기본 부품 4로 만들어진다. 마지막으로 장난감 완제품 7은 2개의 중간 부품 5, 3개의 중간 부품 6과 5개의 기본 부품 4로 만들어진다. 이런 경우에 장난감 완제품 7을 만드는데 필요한 기본 부품의 개수는 1번 16개, 2번 16개, 3번 9개, 4번 17개 이다.
이와 같이 어떤 장난감 완제품과 그에 필요한 부품들 사이의 관계가 주어져 있을 때 하나의 장난감 완제품을 조립하기 위하여 필요한 기본 부품의 종류별 개수를 계산하는 프로그램을 작성하시오.
[Copy]7 8 5 1 2 5 2 2 7 5 2 6 5 2 6 3 3 6 4 4 7 6 3 7 4 5 | [Copy]1 16 2 16 3 9 4 17 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | /************************************************************** Problem: 1021 User: a132034 Language: C++ Result: Success Time:0 ms Memory:1140 kb ****************************************************************/ #include <cstdio> #pragma warning(disable:4996) int ITEM[111][111]; int BASIC[111]; int N, M; void make( int n) { if (BASIC[n] != -1) BASIC[n] ++; else { for ( int i = 1; i < N; ++i) { if (ITEM[n][i] != 0) { for ( int j = 1; j <= ITEM[n][i]; ++j) make(i); } } } } int main() { scanf ( "%d%d" , &N,&M); for ( int i = 1; i <= M; ++i) { int l, m, n; scanf ( "%d%d%d" , &l, &m, &n); ITEM[l][m] = n; BASIC[l] = -1; } make(N); for ( int i = 1; i < N; ++i) { if (BASIC[i] != -1) printf ( "%d %d\n" , i, BASIC[i]); } return 0; } |
기본 부품이 주어지지 않기 때문에 기본 부품을 체크하는 부분이 필요하다.
BASIC 배열로 사용하였다. 처음 입력받을 때 중간부품의 경우 배열의 위치에 -1을 넣어주었다.
그 외에는 재귀함수를 사용하였다.
재귀함수는
1. 기본부품일 경우 -> 기본부품 사용
2. 아닐 경우 -> 이 부품을 만드는데 사용되는 부품에 대해 다시 make함수를 실행
하였다.
'PARK > ALGORITHM' 카테고리의 다른 글
알고리즘 & BOJ 2533 사회망 서비스(SNS)(C++) (0) | 2016.09.06 |
---|---|
BOJ 11049 행렬 곱셈 순서(C++) (0) | 2016.09.06 |
문제은행 & BOJ 2673 교차하지 않는 원의 현들의 최대집합(C++) (0) | 2016.09.05 |
BOJ 1309 동물원(C++) (0) | 2016.08.31 |
BOJ 10844 쉬운 계단 수(C++) (0) | 2016.08.31 |