반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- softeer
- 물채우기
- 파라메트릭
- 처우산정
- Docker
- 경력
- @P0
- 연결요소
- Kafka
- 소프티어
- msSQL
- 13908
- 6987
- 매개변수탐색
- 백준
- 성적평가
- 기술면접
- boj #19237 #어른 상어
- upper_bound
- OFFSET
- BFS
- 백트래킹
- compose
- BOJ
- dfs
- 오퍼레터
- 처우협의
- incr
- 이분탐색
- 퇴사통보
Archives
- Today
- Total
기술 블로그
17615번 볼 모으기 본문
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 |