반응형
문제 설명
정수 4를 1, 2, 3의 합으로 나타내는 방법은 총 7가지가 있다. 합을 나타낼 때는 수를 1개 이상 사용해야 한다.
- 1+1+1+1
- 1+1+2
- 1+2+1
- 2+1+1
- 2+2
- 1+3
- 3+1
정수 n이 주어졌을 때, n을 1, 2, 3의 합으로 나타내는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 테스트 케이스의 개수 T가 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있고, 정수 n이 주어진다. n은 양수이며 11보다 작다.
출력
각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다.
생각
dp문제처럼 보이고, 사실 n이 커진다면 당연히 dp로만 풀어야 한다. 하지만 위 문제는 n이 11보다 작으므로 bfs를 가지고도 충분히 풀 수 있었다!
1에서부터 bfs, 2에서부터 bfs, 3에서 부터 bfs를 해서 각각 1,2,3 씩 더해주며서 n이 만들어 질 때까지 재귀를 하며 n보다 커지면 종료를 하는 식으로 하면 된다!
이 다음문제 부터는 n이 커져서 dp로 풀어야한다.. 그런데 생각보다 어려워서 언제 풀 수 있을까 고민된다.
코드
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
|
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
//1,2,3씩 추가가 되므로 dx={1,2,3}으로 만든다.
static int[] dx = {1,2,3};
static int n;
static int count = 0;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(br.readLine());
for(int i=0; i<t; i++) {
n = Integer.parseInt(br.readLine());
//1,2,3에서 시작하므로 1,2,3에서 bfs를 각각 한다.
for(int j=1; j<=3; j++) {
dfs(j);
}
System.out.println(count);
count = 0;
}
}
static void dfs(int a) {
//n과 같아지면 count를 추가하고 return 하며, n보다 커지면 바로 return해준다.
if(a == n) {
count++;
return;
} else if(a > n) {
return;
}
for(int i=0; i<dx.length; i++) {
dfs(a+dx[i]);
}
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
반응형
'알고리즘 > 코딩 - 백준' 카테고리의 다른 글
[Java][백준][10026번] 적록색약 (0) | 2019.08.02 |
---|---|
[Java][백준][5014번] 스타트 링크 (0) | 2019.08.01 |
[Java][백준][2583번] 영역 구하기 (0) | 2019.07.22 |
[Java][백준][1149] RGB 거리 (0) | 2019.07.17 |
[Java][백준][2579번] 계단 오르기 (0) | 2019.07.16 |