๐ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ
2๊ฐ์ ํฌ์ธํฐ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ๋ค์, ๋ฒ์(window)๋ฅผ ์ ์งํ ์ฑ๋ก ์ด๋(sliding)ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค.
ํฌ ํฌ์ธํธ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ๊ฐ์ ๋์ด๊ฐ ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ๋์ ์ผ๋ก ๋ณํ๋ฉฐ, ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ ํญ์ ๊ตฌ๊ฐ์ ๋์ด๊ฐ ๊ณ ์ ๋์ด ์๋ค๋ ์ฐจ์ด์ ์ด ์๋ค.
๐ DNA ๋น๋ฐ๋ฒํธ - ๋ฐฑ์ค 12891
https://www.acmicpc.net/problem/12891
๋ฌธ์
ํ์์ ๋ฌธ์์ด์ ๊ฐ์ง๊ณ ๋
ธ๋ ๊ฒ์ ์ข์ํ๋ ๋ฏผํธ๋ DNA ๋ฌธ์์ด์ ์๊ฒ ๋์๋ค. DNA ๋ฌธ์์ด์ ๋ชจ๋ ๋ฌธ์์ด์ ๋ฑ์ฅํ๋ ๋ฌธ์๊ฐ {‘A’, ‘C’, ‘G’, ‘T’} ์ธ ๋ฌธ์์ด์ ๋งํ๋ค. ์๋ฅผ ๋ค์ด “ACKA”๋ DNA ๋ฌธ์์ด์ด ์๋์ง๋ง “ACCA”๋ DNA ๋ฌธ์์ด์ด๋ค. ์ด๋ฐ ์ ๋นํ ๋ฌธ์์ด์ ์์ ํ ๋งค๋ฃ๋ ๋ฏผํธ๋ ์์์ DNA ๋ฌธ์์ด์ ๋ง๋ค๊ณ ๋ง๋ค์ด์ง DNA ๋ฌธ์์ด์ ๋ถ๋ถ๋ฌธ์์ด์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ๊ธฐ๋ก ๋ง์๋จน์๋ค.
ํ์ง๋ง ๋ฏผํธ๋ ์ด๋ฌํ ๋ฐฉ๋ฒ์๋ ํฐ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค. ์์์ DNA ๋ฌธ์์ด์ ๋ถ๋ถ๋ฌธ์์ด์ ๋ฝ์์ ๋ “AAAA”์ ๊ฐ์ด ๋ณด์์ ์ทจ์ฝํ ๋น๋ฐ๋ฒํธ๊ฐ ๋ง๋ค์ด ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ๋ฏผํธ๋ ๋ถ๋ถ๋ฌธ์์ด์์ ๋ฑ์ฅํ๋ ๋ฌธ์์ ๊ฐ์๊ฐ ํน์ ๊ฐ์ ์ด์์ด์ฌ์ผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋ค๋ ๊ท์น์ ๋ง๋ค์๋ค.
์์์ DNA๋ฌธ์์ด์ด “AAACCTGCCAA” ์ด๊ณ ๋ฏผํธ๊ฐ ๋ฝ์ ๋ถ๋ถ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ 4๋ผ๊ณ ํ์. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ถ๋ฌธ์์ด์ ‘A’ ๋ 1๊ฐ ์ด์, ‘C’๋ 1๊ฐ ์ด์, ‘G’๋ 1๊ฐ ์ด์, ‘T’๋ 0๊ฐ ์ด์์ด ๋ฑ์ฅํด์ผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ํ์. ์ด๋ “ACCT” ๋ ‘G’ ๊ฐ 1 ๊ฐ ์ด์ ๋ฑ์ฅํด์ผ ํ๋ค๋ ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํด ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ์ง ๋ชปํ๋ค. ํ์ง๋ง “GCCA” ์ ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ฏผํธ๊ฐ ๋ง๋ ์์์ DNA ๋ฌธ์์ด๊ณผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ๋ถ๋ถ๋ถ์์ด์ ๊ธธ์ด, ๊ทธ๋ฆฌ๊ณ {‘A’, ‘C’, ‘G’, ‘T’} ๊ฐ ๊ฐ๊ฐ ๋ช๋ฒ ์ด์ ๋ฑ์ฅํด์ผ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ์ ์๋์ง ์์๋๋ก ์ฃผ์ด์ก์ ๋ ๋ฏผํธ๊ฐ ๋ง๋ค ์ ์๋ ๋น๋ฐ๋ฒํธ์ ์ข
๋ฅ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์. ๋จ ๋ถ๋ถ๋ฌธ์์ด์ด ๋ฑ์ฅํ๋ ์์น๊ฐ ๋ค๋ฅด๋ค๋ฉด ๋ถ๋ถ๋ฌธ์์ด์ด ๊ฐ๋ค๊ณ ํ๋๋ผ๋ ๋ค๋ฅธ ๋ฌธ์์ด๋ก ์ทจ๊ธํ๋ค.
์
๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋ฏผํธ๊ฐ ์์๋ก ๋ง๋ DNA ๋ฌธ์์ด ๊ธธ์ด |S|์ ๋น๋ฐ๋ฒํธ๋ก ์ฌ์ฉํ ๋ถ๋ถ๋ฌธ์์ด์ ๊ธธ์ด |P| ๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ |P| ≤ |S| ≤ 1,000,000)
๋๋ฒ ์งธ ์ค์๋ ๋ฏผํธ๊ฐ ์์๋ก ๋ง๋ DNA ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค.
์ธ๋ฒ ์งธ ์ค์๋ ๋ถ๋ถ๋ฌธ์์ด์ ํฌํจ๋์ด์ผ ํ {‘A’, ‘C’, ‘G’, ‘T’} ์ ์ต์ ๊ฐ์๊ฐ ๊ณต๋ฐฑ์ ๊ตฌ๋ถ์ผ๋ก ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ์๋ |S| ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ด ์๋ ์ ์์ด๋ฉฐ ์ด ํฉ์ |S| ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ด ๋ณด์ฅ๋๋ค.
์ถ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์ ๋ฏผํธ๊ฐ ๋ง๋ค ์ ์๋ ๋น๋ฐ๋ฒํธ์ ์ข
๋ฅ์ ์๋ฅผ ์ถ๋ ฅํด๋ผ.
๐ ํต์ฌ ์์ด๋์ด
1. ์ฒซ ๋ฒ ์งธ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (์ธ๋ฑ์ค 0๋ถํฐ P-1) ์ ‘A’, ‘C’, ‘G’, ‘T’ ๊ฐ์ ์นด์ดํธ (ํด์๋งต getOrDefault ์ด์ฉ)
2. ํ ์นธ์ฉ ์์ผ๋ก ์ด๋ํ๋ฉด์ ๊ฐ์ฅ ๋ค์ ๋ฌธ์ ์นด์ดํธ ์ถ๊ฐ, ๊ฐ์ฅ ์์ ๋ฌธ์ ์นด์ดํธ ๊ฐ์ (ํด์๋งต getOrDefault ์ด์ฉ)
3. ๊ฐ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ ํจ์ฑ ๊ฒ์ฌ (๊ฐ ๋ฌธ์์ด์ ํฌํจ๋ผ์ผ ํ ์ต์ ๊ฐ์ ํต๊ณผ ์ฌ๋ถ) ํต๊ณผ ์ cnt++;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;
public class Main {
static char[] chars;
static Map<Character, Integer> hm;
static int[] limit = new int[4];
static int cnt = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int S = Integer.parseInt(st.nextToken());
int P = Integer.parseInt(st.nextToken());
hm = new HashMap<>();
chars = br.readLine().toCharArray();
st = new StringTokenizer(br.readLine());
for (int i = 0; i < 4; i++) {
limit[i] = Integer.parseInt(st.nextToken());
}
// ์ด๊ธฐ ๋ฌธ์์ด
for (int i = 0; i < P; i++) insert(chars[i]);
validation();
for (int i = P; i < S; i++) {
insert(chars[i]);
remove(chars[i-P]);
validation();
}
System.out.println(cnt);
}
// ๋ฉ์๋
private static void insert(char c) {
hm.put(c,hm.getOrDefault(c,0)+1);
}
private static void remove(char c){
hm.put(c,hm.getOrDefault(c,0)-1);
}
private static void validation(){
char[] dna = {'A', 'C', 'G', 'T'};
for (int i = 0; i < 4; i++) {
if(limit[i] == 0) continue;
if(!hm.containsKey(dna[i])) return;
if(hm.get(dna[i]) < limit[i]) return;
}
cnt++;
}
}
์ฝํ ์ ๋ฆฌ ๊นํ๋ธ ๋งํฌ
GitHub - Suyoung225/JavaPrac: Java๋ก ๋ฐฑ์ค, ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด
Java๋ก ๋ฐฑ์ค, ํ๋ก๊ทธ๋๋จธ์ค ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ํ์ด. Contribute to Suyoung225/JavaPrac development by creating an account on GitHub.
github.com
'์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] ์ต์๊ณต๋ฐฐ์ - ๋ฐฑ์ค 1934 (JAVA) - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ (0) | 2023.01.05 |
---|---|
[BOJ] ๊ฑฐ์ ์์ - ๋ฐฑ์ค 1456 (์๋ฐ JAVA) - ์๋ผํ ์คํ ๋ค์ค์ ์ฒด (1) | 2023.01.04 |
[BOJ] ๋ฒ๋ธ์ํธ ๋ฐฑ์ค 1517, 2751 (์๋ฐ JAVA) - ๋ณํฉ์ ๋ ฌ (0) | 2023.01.01 |
[BOJ] ๋๋จธ์ง ํฉ - ๋ฐฑ์ค 10986 (์๋ฐ JAVA) - ๊ตฌ๊ฐ ํฉ (0) | 2022.12.29 |
์๋ฐ ํ๋ณํ ์ ๋ฆฌ (0) | 2022.12.27 |
๋๊ธ