반응형
문제
https://www.acmicpc.net/problem/16139
16139번: 인간-컴퓨터 상호작용
첫 줄에 문자열 S가 주어진다. 문자열의 길이는 200,000자 이하이며 알파벳 소문자로만 구성되었다. 두 번째 줄에는 질문의 수 q가 주어지며, 문제의 수는 1≤q≤200,000을 만족한다. 세 번째
www.acmicpc.net
풀이
누적 합을 사용하여 풀이할 수 있습니다.
저는 문자의 갯수가 나오는 누적합을 구하기 위해 Dictionary를 Array로 감싸주었습니다.
"mandos" 라는 문자열이 있다면,
array[0] = ["m": 1]
array[1] = ["m": 1, "a": 1] 과 같은 형태로 만들어 주었습니다.
그 이후 누적 합을 구하는 것 처럼,
l ~ r 까지의 알파벳(a)이 들어오는 횟수를 array[r][a] - array[l - 1][a] 와 같이 구해줬습니다.
소스코드
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let s = ["-"] + readLine()!.map { String($0) } | |
let q = Int(readLine()!)! | |
var cache = [[String: Int]](repeating: [:], count: s.count + 1) | |
for i in 1..<s.count { | |
cache[i] = cache[i - 1] | |
cache[i][s[i], default: 0] += 1 | |
} | |
for _ in 0..<q { | |
let input = readLine()!.split(separator: " ") | |
let alpha = String(input[0]), l = Int(input[1])! + 1, r = Int(input[2])! + 1 | |
print(cache[r][alpha, default: 0] - cache[l - 1][alpha, default: 0]) | |
} |
후기
안풀릴줄 알았는데.. 통과돼서 조금 신기했던 문제였습니다.
다른분들의 풀이를 보니깐 아스키 값으로 푸시는 분도 계셨는데 좋은 방법인 것 같습니다.
반응형
'PS > 백준' 카테고리의 다른 글
[BOJ] 백준 11660 구간 합 구하기 5 (Swift) (0) | 2023.04.07 |
---|---|
[BOJ] 백준 10986 나머지 합 (Swift) (0) | 2023.04.07 |
[BOJ] 백준 2559 수열 (Swift) (0) | 2023.04.07 |
[BOJ] 백준 11659 구간 합 구하기 4 (Swift) (0) | 2023.04.07 |
[BOJ] 백준 12865 평범한 배낭 (Swift) (0) | 2023.04.07 |