[BaekJoon] 8958번 - OX퀴즈 [Java][C++]
[BaekJoon] 8958번 - OX퀴즈 [Java][C++]
1. 문제 풀이
OX퀴즈의 결과에서 점수는 X로 구분할 수 있는 각 맞은 문제 덩어리에 대해 $1$ 부터 덩어리의 크기까지의 합과 같다.
2. 코드
1. 풀이 [Java]
StringTokenizer를 활용해서 X를 기준으로 파싱한 맞은 문제 덩어리 토큰들을 만들었다. 각 토큰의 길이에 대해 합 공식을 적용하면 해결할 수 있다.
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
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
int t = Integer.parseInt(br.readLine());
while (t-- > 0) {
st = new StringTokenizer(br.readLine(), "X");
int sum = 0;
while (st.hasMoreTokens()) {
int x = st.nextToken().length();
sum += x * (x + 1) / 2;
}
sb.append(sum).append("\n");
}
System.out.print(sb);
}
}
2. 풀이 [C++]
맞은 문제 덩어리의 판별은 X에서 O로 바뀌는 순간을 시작점으로 O에서 X로 바뀌는 순간을 끝점으로 잡고 합 공식을 적용하면 된다. 이때 O로 시작하는 경우와 끝나는 경우도 빼먹지 않게 주의해야 한다.
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
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
string s;
cin >> s;
int sum = 0;
char prev = '\0';
int idx = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == 'O') {
if (prev == 'X') {
idx = i;
}
} else {
if (prev == 'O') {
int len = i - idx;
sum += len * (len + 1) / 2;
}
}
prev = s[i];
}
if (s.back() == 'O') {
int len = (int)s.size() - idx;
sum += len * (len + 1) / 2;
}
cout << sum << '\n';
}
}
This post is licensed under CC BY 4.0 by the author.