https://www.acmicpc.net/problem/20437
20437번: 문자열 게임 2
첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.
www.acmicpc.net
[풀이]
투 포인터로 풀었다.
풀이 과정은 다음과 같다.
<과정1>
입력 받은 문자열의 각 자리별 인덱스 위치를 저장해두는 배열을 만든다.
예를 들어 abbc라는 문자열을 받는다면,
[[0],[1,2],[3]]과 같이 인덱스를 저장하는 배열을 만든다.
문자열을 W라고 표현하고 저장하는 배열을 abcIndex라고 한다면 아래와 같다.
var W = br.readLine().toString()
var abcIndex = Array(26,{ arrayListOf<Int>() })
repeat(W.length)
{
i ->
abcIndex[W[i] - 'a'].add(i)
}
<과정2 - 투 포인터>
알파벳은 26개이므로 26번 아래의 과정을 반복한다.
이 때 각 알파벳 배열에 인덱스가 K개 보다 적다면 굳이 할 필요가 없으므로 스킵한다.
투 포인터로
left = 0, right = K-1로 초기값을 설정을 하고
right가 해당 알파벳의 사이즈보다 작을 경우에, 각 값을 최신화를 해주면 끝이다.
var answer1 = Int.MAX_VALUE
var answer2 = Int.MIN_VALUE
for(i in 0 until 26)
{
if(abcIndex[i].size < K) continue
var left = 0
var right = K - 1
while(right < abcIndex[i].size)
{
answer1 = min(answer1, abcIndex[i][right] - abcIndex[i][left])
answer2 = max(answer2, abcIndex[i][right++] - abcIndex[i][left++])
}
}
[전체 코드]
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
import kotlin.math.max
import kotlin.math.min
fun main()
{
var br = BufferedReader(InputStreamReader(System.`in`))
var bw = BufferedWriter(OutputStreamWriter(System.`out`))
var N = br.readLine().toInt()
repeat(N)
{
var W = br.readLine().toString()
var K = br.readLine().toInt()
var abcIndex = Array(26,{ arrayListOf<Int>() })
repeat(W.length)
{
i ->
abcIndex[W[i] - 'a'].add(i)
}
var answer1 = Int.MAX_VALUE
var answer2 = Int.MIN_VALUE
for(i in 0 until 26)
{
if(abcIndex[i].size < K) continue
var left = 0
var right = K - 1
while(right < abcIndex[i].size)
{
answer1 = min(answer1, abcIndex[i][right] - abcIndex[i][left])
answer2 = max(answer2, abcIndex[i][right++] - abcIndex[i][left++])
}
}
if(answer1 == Int.MAX_VALUE) bw.write("-1\n")
else{
answer1++
answer2++
bw.write("$answer1 $answer2\n")
}
}
bw.flush()
bw.close()
}
'백준 > 투 포인터' 카테고리의 다른 글
백준 [2467] kotlin (0) | 2023.01.12 |
---|---|
백준 [2493] kotlin (0) | 2023.01.11 |
백준 [2531] kotlin (0) | 2023.01.09 |
백준 [1806] kotlin (0) | 2023.01.08 |
백준 [1253] kotlin (0) | 2023.01.07 |