Algorithm

[BOJ] 16438. 원숭이 스포츠

프로그래민 2021. 7. 9. 00:25
반응형

분할정복을 이용하여 해결할 수 있던 문제였다.

이 문제 같은경우 맨처음 문제자체를 이해하지 못하였다. 하지만 분할정복이라는게 떠올랐고, 머지소트와 비슷한 원리로 접근해보았다. 우선 7일을 출력하기 위해 result란 이차원배열을 만들어두고, 분할정복을 시도하였다. 우선 start와 end값을 받고, 이들의 중간값인 mid를 구하게 된다. 이렇게 start~mid, mid~end 까지 두 그룹으로 나누고 알파벳을 각 각 배정해준다. 이렇게 되면 두그룹은 서로 한번은 적으로 만나는 것이 보장이되게 된다. 이런식으로 재귀호출하여 분할정복을 적용해보았다. 단 맨끝 결과에 오로지 B로만 차있는 경우가 생기게 되는데 이경우엔 A를 임의로 하나 넣어주었다.

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
package algostudy2;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
 
public class Main_bj_16438_원숭이스포츠 {
    static int N;
    static char[][] result;
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
 
        result = new char[7][N];
 
        func(00, N);
 
        for (int i = 0; i < 7; i++) {
            if (!Arrays.asList(result[i]).contains("A")) {
                result[i][0= 'A';
            }
            for (int j = 0; j < N; j++) {
                System.out.print(result[i][j]);
            }
            System.out.println();
        }
    }
 
    static void func(int depth, int start, int end) {
        if (depth == 7) {
            return;
        }
 
        int mid = (start + end) / 2;
 
        for (int i = start; i < mid; i++) {
            result[depth][i] = 'A';
        }
 
        for (int i = mid; i < end; i++) {
            result[depth][i] = 'B';
        }
 
        func(depth + 1, start, mid);
        func(depth + 1, mid, end);
    }
}
 
               
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 1701. Cubeditor  (0) 2021.07.14
[BOJ] 9935. 문자열 폭발  (0) 2021.07.13
[BOJ] 16432. 떡장수와 호랑이  (0) 2021.07.08
[BOJ] 1967. 트리의 지름  (0) 2021.07.02
[BOJ] 16437. 양 구출 작전  (0) 2021.07.02