문제 출저
https://www.acmicpc.net/problem/16139
16139번: 인간-컴퓨터 상호작용
첫 줄에 문자열 $S$가 주어진다. 문자열의 길이는 $200,000$자 이하이며 알파벳 소문자로만 구성되었다. 두 번째 줄에는 질문의 수 $q$가 주어지며, 문제의 수는 $1\leq q\leq 200,000$을 만족한다. 세 번째
www.acmicpc.net
문제 풀이
문자열이 주어지고 알파벳과 구간의 시작과 끝을 q번 주어집니다.
이 떄, 시작과 끝 구간에 알파벳의 갯수를 구해야 합니다.
누적합을 통해 풀었습니다.
문자열이 주어졌을 때, a~z 까지의 각각의 알파벳에 해당하는 2차원 배열의 누적합을 만들었습니다.
이 누적합 배열을 이용하여 정답을 구했습니다.
소스 코드
package baekjoon.backjoon10.day2131.day28;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/*
인간-컴퓨터 상호작용
https://www.acmicpc.net/problem/16139
*/
public class B16139 {
static String s;
static int q;
static char a;
static int l,r;
static int[][] prefix;
static StringBuilder sb;
static List<Integer> answer;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
s = br.readLine();
q = Integer.parseInt(br.readLine());
int n = s.length();
prefix = new int[26][n+1];
for(int i = 1; i < n+1; i++) {
for(int j = 0; j < 26; j++) {
prefix[j][i] = prefix[j][i-1];
}
int number = (int) (s.charAt(i-1) - 'a');
prefix[number][i] += 1;
}
answer = new ArrayList<>();
for(int i = 0; i < q; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
a = st.nextToken().charAt(0);
l = Integer.parseInt(st.nextToken())+1;
r = Integer.parseInt(st.nextToken())+1;
simulation();
}
sb = new StringBuilder();
for(int i = 0; i < answer.size()-1; i++) {
sb.append(answer.get(i)).append("\n");
}
sb.append(answer.get(answer.size()-1));
System.out.println(sb);
}
public static void simulation() {
int number = (int)(a - 'a');
int result = prefix[number][r] - prefix[number][l-1];
answer.add(result);
}
}