Skip to content

Commit b4c8bf9

Browse files
committed
[Silver I] Title: 볼 모으기, Time: 20 ms, Memory: 3476 KB, Score: 100 point -BaekjoonHub
1 parent 6af8cb6 commit b4c8bf9

File tree

2 files changed

+103
-0
lines changed

2 files changed

+103
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
# [Silver I] 볼 모으기 - 17615
2+
3+
[문제 링크](https://www.acmicpc.net/problem/17615)
4+
5+
### 성능 요약
6+
7+
메모리: 3476 KB, 시간: 20 ms
8+
9+
### 분류
10+
11+
그리디 알고리즘
12+
13+
### 제출 일자
14+
15+
2025년 5월 13일 09:27:35
16+
17+
### 문제 설명
18+
19+
<p>빨간색 볼과 파란색 볼이 <그림 1>에서 보인 것처럼 일직선상에 섞여 놓여 있을 때, 볼을 옮겨서 같은 색 볼끼리 인접하게 놓이도록 하려고 한다. 볼을 옮기는 규칙은 다음과 같다.</p>
20+
21+
<ol>
22+
<li>바로 옆에 다른 색깔의 볼이 있으면 그 볼을 모두 뛰어 넘어 옮길 수 있다. 즉, 빨간색 볼은 옆에 있는 파란색 볼 무더기를 한 번에 뛰어 넘어 옮길 수 있다. 유사하게, 파란색 볼은 옆에 있는 빨간색 볼 무더기를 한 번에 뛰어 넘어 옮길 수 있다.</li>
23+
<li>옮길 수 있는 볼의 색깔은 한 가지이다. 즉, 빨간색 볼을 처음에 옮겼으면 다음에도 빨간색 볼만 옮길 수 있다. 유사하게, 파란색 볼을 처음에 옮겼으면 다음에도 파란색 볼만 옮길 수 있다.</li>
24+
</ol>
25+
26+
<p>예를 들어, 처음에 볼이 <그림 1>에서 보인 것처럼 있을 때, 빨간 볼을 <그림 2>에서 보인 것처럼 옮긴 후, <그림 3>에서 보인 것처럼 옮긴다면 두 번 만에 같은 색끼리 모을 수 있다.</p>
27+
28+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/347db7e2-5704-4a28-ab85-682bf30f3816/-/crop/894x133/0,0/-/preview/" style="width: 447px; height: 67px;"></p>
29+
30+
<p style="text-align: center;"><그림 1></p>
31+
32+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/347db7e2-5704-4a28-ab85-682bf30f3816/-/crop/894x162/0,228/-/preview/" style="width: 447px; height: 81px;"></p>
33+
34+
<p style="text-align: center;"><그림 2></p>
35+
36+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/347db7e2-5704-4a28-ab85-682bf30f3816/-/crop/894x166/0,480/-/preview/" style="width: 447px; height: 83px;"></p>
37+
38+
<p style="text-align: center;"><그림 3></p>
39+
40+
<p>반면에 파란색 볼을 선택하여 에서 보인 것처럼 옮기면(화살표에 있는 수는 옮기는 순서를 나타낸다) 네 번을 옮겨야 같은 색의 볼끼리 모을 수 있다.</p>
41+
42+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/cf727ec0-1542-4ca1-bdb8-cfc695a5bdfa/-/preview/" style="width: 445px; height: 146px;"></p>
43+
44+
<p style="text-align: center;"><그림 4></p>
45+
46+
<p>일직선상에 놓여 있는 볼에 관한 정보가 주어질 때, 규칙에 따라 볼을 이동하여 같은 색끼리 모으되 최소 이동횟수를 찾는 프로그램을 작성하시오.</p>
47+
48+
### 입력
49+
50+
<p>첫 번째 줄에는 볼의 총 개수 N이 주어진다. (1 ≤ N ≤ 500,000) 다음 줄에는 볼의 색깔을 나타내는 문자 R(빨간색 볼) 또는 B(파란색 볼)가 공백 없이 주어진다. 문자열에는 R 또는 B 중 한 종류만 주어질 수도 있으며, 이 경우 답은 0이 된다.</p>
51+
52+
### 출력
53+
54+
<p>최소 이동횟수를 출력한다.</p>
55+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <iostream>
2+
3+
using namespace std;
4+
5+
int main() {
6+
int N;
7+
string s;
8+
cin >> N >> s;
9+
10+
char lastBall = s[N - 1];
11+
int idx1 = N - 1;
12+
for (int i = N - 1; i > 0; i--) {
13+
if (s[i] != lastBall) {
14+
idx1 = i;
15+
break;
16+
}
17+
}
18+
19+
int rCnt1 = 0;
20+
int bCnt1 = 0;
21+
for (int i = idx1; i >= 0; i--) {
22+
if (s[i] == 'R') rCnt1++;
23+
else bCnt1++;
24+
}
25+
int ans1 = min(rCnt1, bCnt1);
26+
27+
char firstBall = s[0];
28+
int idx2 = 0;
29+
for (int i = 0; i < N; i++) {
30+
if (s[i] != firstBall) {
31+
idx2 = i;
32+
break;
33+
}
34+
}
35+
36+
int rCnt2 = 0;
37+
int bCnt2 = 0;
38+
for (int i = idx2; i < N; i++) {
39+
if (s[i] == 'R') rCnt2++;
40+
else bCnt2++;
41+
}
42+
int ans2 = min(rCnt2, bCnt2);
43+
44+
cout << min(ans1, ans2);
45+
46+
47+
return 0;
48+
}

0 commit comments

Comments
 (0)