Coding Test/BaekJoon_Python

백준 16139 <인간-컴퓨터 상호작용> Python

JunOnJuly 2023. 11. 28. 18:24
728x90

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

 

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

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

www.acmicpc.net


입력의 크기가 커서 100점 맞기가 어려운 문제였습니다. 단순히 순회하면 시간초과가 생기므로 누적합 리스트를 만들어 풀어야합니다. 문자별로 누적합 리스트를 만들어 풀었습니다.


import sys
from collections import defaultdict


def solution(S, data_list):
    # 문자별 누적합
    subsum = [[0 for _ in range(len(S)+1)] for __ in range(26)]
    # 문자열 순회 및 누적합 리스트 완성
    for idx_S in range(len(S)):
        for idx_subsum in range(len(subsum)):
            # 해당 문자면 해당 문자 누적합의 해당 인덱스 값 + 1
            if idx_subsum == ord(S[idx_S])-97:
                subsum[idx_subsum][idx_S+1] = subsum[idx_subsum][idx_S] + 1
            # 아니면 그대로
            else:
                subsum[idx_subsum][idx_S+1] = subsum[idx_subsum][idx_S]
    # 데이터 순회
    for now_str, start, end in data_list:
        print(subsum[ord(now_str)-97][int(end)+1] - subsum[ord(now_str)-97][int(start)])
               
       
S = sys.stdin.readline().strip()
q = int(sys.stdin.readline().strip())
data_list = [sys.stdin.readline().strip().split() for _ in range(q)]
solution(S, data_list)

 

728x90