https://www.acmicpc.net/problem/12891
해쉬맵을 쓰거나 문자열을 인덱스로 변환해주는 메소드를 만들어서 사용하면 된다.
left와 right사이의 거리가 일정한 문제이다.
import java.util.*;
import java.io.*;
public class Main
{
public static HashMap<Character,Integer> std = new HashMap();
public static int s;
public static int p;
public static String string;
public static boolean check(HashMap<Character,Integer> check_count){
if((check_count.getOrDefault('A',0)>=std.getOrDefault('A',0))
&& (check_count.getOrDefault('C',0)>=std.getOrDefault('C',0))
&& (check_count.getOrDefault('G',0)>=std.getOrDefault('G',0))
&& (check_count.getOrDefault('T',0)>=std.getOrDefault('T',0))
){
return true;
}
return false;
}
public static int search(){
int ans =0;
HashMap<Character,Integer> check_count = new HashMap();
for(int i=0;i<p;i++){
check_count.put(string.charAt(i),check_count.getOrDefault(string.charAt(i),0)+1);
}
if(check(check_count)) ans+=1;
for(int left=1; left<s-p+1; left++){
check_count.put(string.charAt(left-1),check_count.get(string.charAt(left-1))-1);
check_count.put(string.charAt(left+p-1),check_count.getOrDefault(string.charAt(left+p-1),0)+1);
if(check(check_count)) ans+=1;
}
return ans;
}
public static void main(String[] args) throws IOException{
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input1 = br.readLine().split(" ");
s = Integer.valueOf(input1[0]);
p = Integer.valueOf(input1[1]);
string = br.readLine();
String[] input2 = br.readLine().split(" ");
std.put('A', Integer.valueOf(input2[0]));
std.put('C', Integer.valueOf(input2[1]));
std.put('G', Integer.valueOf(input2[2]));
std.put('T', Integer.valueOf(input2[3]));
//답 구하기
int ans = search();
System.out.println(ans);
}
}
import java.util.Scanner;
class Main
{
static int baseToIndex(char alp) {
if (alp == 'A') return 0;
else if (alp == 'C') return 1;
else if (alp == 'G') return 2;
else if (alp == 'T') return 3;
return -1;
}
static boolean isValidSequence(int[] baseCount, int[] minimumBaseCount) {
for (int i = 0; i < baseCount.length; i++)
if (baseCount[i] < minimumBaseCount[i])
return false;
return true;
}
public static void main (String[] args) {
Scanner sc = new Scanner(System.in);
int S = sc.nextInt();
int P = sc.nextInt();
char[] sequence = sc.next().toCharArray();
int[] minimumBaseCount = new int[4];
for (int i = 0; i < 4; i++)
minimumBaseCount[i] = sc.nextInt();
int[] currentBaseCount = new int[4];
for (int i = 0; i < P; i++)
currentBaseCount[baseToIndex(sequence[i])]++;
int ans = isValidSequence(currentBaseCount, minimumBaseCount) ? 1 : 0;
for (int i = 1; i <= S - P; i++) {
currentBaseCount[baseToIndex(sequence[i - 1])]--;
currentBaseCount[baseToIndex(sequence[i + P - 1])]++;
if (isValidSequence(currentBaseCount, minimumBaseCount))
ans++;
}
System.out.println(ans);
}
}
'Problem Solving > 투포인터' 카테고리의 다른 글
BOJ11728 배열합치기 (0) | 2024.03.04 |
---|---|
BOJ2118 두개의 탑*R (0) | 2024.03.03 |
BOJ2230 수 고르기 (0) | 2024.03.03 |
BOJ 1806 부분합 (0) | 2024.03.03 |
투포인터 개념 (1) | 2024.03.03 |