본문 바로가기
백준

[16139] 인간-컴퓨터 상호작용

by kmyobin 2023. 1. 12.


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

 

16139번: 인간-컴퓨터 상호작용

첫 줄에 문자열 $S$가 주어진다. 문자열의 길이는 $200,000$자 이하이며 알파벳 소문자로만 구성되었다. 두 번째 줄에는 질문의 수 $q$가 주어지며, 문제의 수는 $1\leq q\leq 200,000$을 만족한다. 세 번째

www.acmicpc.net

2차원 배열 누적합 문제이다.

알고리즘은 맞았는데 마지막에서 삽질해서 시간이 조금 걸렸다.

 

S[i][j] : 0~i까지 알파벳 j의 누적합

으로 설정했다.

 

알파벳 j는 입력을 받은 후 아스키 코드에 맞춰 97을 빼주고 계산하였다.

 

누적합을 구하는 건  금방했는데, 구간별 누적합을 구하는 데에 오랜 시간이 걸렸다.

l이 들어올 때 0이면 처음부터 탐색하는 것이므로 l=0,

0보다 크면 S[l-1][index]로 설정하였다.

 

전체 코드는 아래에 있다.

#include <iostream>
#include <string>
using namespace std;

string A;
int S[200001][26];
// S[i][j] : 0~i까지 알파벳 j의 누적합
int q;

int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	
	cin >> A;

	for (int i = 0; i < A.length(); i++) {
		int j = A[i] - 97; 
		if (i != 0) {
			for (int k = 0; k < 26; k++) {
				S[i][k] = S[i - 1][k]; 
			}
		}
		S[i][j]++;
	}

	cin >> q;
	for (int i = 0; i < q; i++) {
		char input; int r, l;
		cin >> input;
		cin >> l >> r;
		int index = input - 97;

		int large = S[r][index];
		int small = (l > 0) ? S[l - 1][index] : 0; // 0부터 시작하면 첫 부분부터 탐색하는 것임

		printf("%d\n", large - small);
	}
}

'백준' 카테고리의 다른 글

[9012] 괄호  (0) 2023.01.17
[10986] 나머지 합  (0) 2023.01.16
[25682] 체스판 다시 칠하기 2  (0) 2023.01.11
[11660] 구간 합 구하기 5  (0) 2023.01.09
[2559] 수열  (0) 2023.01.08

댓글