기술 블로그

17615번 볼 모으기 본문

알고리즘 문제/BOJ

17615번 볼 모으기

parkit 2019. 12. 29. 21:33
728x90
반응형

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




처음 생각은 dfs를 떠올렸으나, 바로 dfs를 할 필요가 없음을 알았다.

그리고 정렬도 생각했으나, 이 때에는 R, B 모두 움직이므로 불가능했다.


그래서 다시 생각을 해봤을 때



R만 움직여서 R들을 맨 왼쪽으로 옮길 것인지, 맨 오른쪽으로 옮길 것인지

B만 움직여서 B들을 맨 왼쪽으로 옮길 것인지, 맨 오른쪽으로 옮길 것인지



위의 4가지 경우의 수가 있었다.

각 경우를 잘 구현하면 된다.


물론,  vc의 첫 원소와 맨 마지막 원소에 따라서 잘 대처(?)해주면 된다.





코드가 길어 보이는 것은 착각일 수도 있다.






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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <bits/stdc++.h>
 
using namespace std;
 
int n, cnt, ans = 2e9;
vector<char> vc;
vector<int> rc, bc;
 
int main()
{
    //freopen("C:\\Users\\park7\\Desktop\\sample_input.txt", "r", stdin);
    cin.tie(0);
    scanf("%d"&n);
    getchar();
 
    char c;
    int redc = 0, bluec = 0;
 
    for (int i = 0; i < n; i++) {
        scanf("%c"&c);
        vc.push_back(c);
 
        if (c == 'R') {
            if(bluec) bc.push_back(bluec);
            bluec = 0;
            ++redc;
        }
        else if (c == 'B') {
            if(redc) rc.push_back(redc);
            redc = 0;
            ++bluec;
        }
    }
 
    if (bluec) bc.push_back(bluec);
    if (redc) rc.push_back(redc);
 
    if (rc.empty() || bc.empty()) {
        printf("0\n");
        return 0;
    }
 
    int Left = 2e9, Right = 2e9;
 
    // R만 움직임
    int total_red = accumulate(rc.begin(), rc.end(), 0);
    
    // R을 맨 왼쪽으로만 옮겼을 때
    if (vc[0== 'R') {
        Left = total_red - rc[0];
    }
    else {
        Left = total_red;
    }
 
    // R을 맨 오른쪽으로만 옮겼을 때
    if (vc[vc.size() - 1== 'R') {
        Right = total_red - rc[rc.size() - 1];
    }
    else {
        Right = total_red;
    }
 
    ans = min(Left, Right);
 
    Left = Right = 2e9// 최솟값을 구하기 위함
 
    // B만 움직임
    int total_blue = accumulate(bc.begin(), bc.end(), 0);
 
    // B를 맨 왼쪽으로
    if (vc[0== 'B') {
        Left = total_blue - bc[0];
    }
    else {
        Left = total_blue;
    }
 
    // B를 맨 오른쪽으로
    if (vc[vc.size() - 1== 'B') {
        Right = total_blue - bc[bc.size() - 1];
    }
    else {
        Right = total_blue;
    }
 
    printf("%d\n", min(ans, min(Left, Right)));
 
    return 0;
}
cs



















728x90
반응형

'알고리즘 문제 > BOJ' 카테고리의 다른 글

18244번 변형 계단 수  (0) 2020.01.01
10844번 쉬운 계단 수  (0) 2020.01.01
17300번 패턴  (0) 2019.12.26
2437번 저울  (0) 2019.12.26
14927번 전구 끄기  (0) 2019.12.25