๋ฌธ์
๋ฌธ์์ด์ด ์ฃผ์ด์ง๊ณ
๊ทธ ๋ฌธ์์ด์ ๋ถ๋ถ๋ฌธ์์ด๋ก ๋น๋ฐ๋ฒํธ๋ฅผ ๋ง๋ค๊ฒ์ด๋ค.
๋ถ๋ถ๋ฌธ์์ด์ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด
2๊ฐ์ ํฌ์ธํฐ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ๋ค์
๋ฒ์(window)๋ฅผ ์ ์งํ ์ฑ๋ก ์ด๋(sliding)ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฒ์ด๋ค.
์กฐ๊ฑด์ A, C, G, T์ ์ต์ ๊ฐ์๋ฅผ ์ถฉ์กฑํด์ผ๋ง ํ๋ค. ์ฝ๋์์ ๋ฌธ์ ํ๋์ฉ์ ๊ฐ์๋ฅผ ์ถฉ์กฑํ ๋๋ง๋ค checkSecret์ ๊ฐ์๋ฅผ 1์ฉ ์ฆ๊ฐ์์ผ์ฃผ๊ณ
checkSecret์ด 4๊ฐ ๋๋ฉด 4๊ฐ์ ๋ฌธ์ ๋ชจ๋ ์กฐ๊ฑด์ ์ถฉ์กฑ๋ ๊ฒ์ผ๋ก
๋น๋ฐ ๋ฒํธ ์ข
๋ฅ์ ์ ํ๋๊ฐ ์์ฑ๋๋ค. (Result++)
๊ทธ๋ ๊ฒ ๊ตฌํ ๊ฐ์์ ์ดํฉ์ ์ถ๋ ฅํ๋ค.
์๋ ์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
S(๋ฌธ์์ด ํฌ๊ธฐ) P(๋ถ๋ถ ๋ฌธ์์ด์ ํฌ๊ธฐ)
A(๋ฌธ์์ด ๋ฐ์ดํฐ)
checkArr(๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด)
myArr(ํ์ฌ ์ํ ๋ฐฐ์ด)
checkSecret(๋ช ๊ฐ์ ๋ฌธ์์ ๊ด๋ จ๋ ๊ฐ์๋ฅผ ์ถฉ์กฑํ๋์ง ํ๋จํ๋ ๋ณ์)
P ๋ฒ์(0 ~ P - 1)๋งํผ S ๋ฐฐ์ด์ ์ ์ฉํ๊ณ , ์ ํจํ ๋น๋ฐ๋ฒํธ์ธ์ง ํ๋จํ๊ธฐ
for(i๋ฅผ P์์ S๊น์ง ๋ฐ๋ณต)
{
j ์ ์ธ(i - P)
// ์ด ๋ถ๋ถ์ ํจ์๋ก ๋ณ๋ ๊ตฌํํ๊ธฐ
ํ ์นธ์ฉ ์ด๋ํ๋ฉด์ ์ ๊ฑฐ๋๋ ๋ฌธ์์ด๊ณผ ์๋ก ๋ค์ด์ค๋ ๋ฌธ์์ด์ ์ฒ๋ฆฌํ๊ธฐ
์ ํจํ ๋น๋ฐ๋ฒํธ์ธ์ง(checkSecret == 4) ํ๋จํด ๊ฒฐ๊ด๊ฐ์ ์
๋ฐ์ดํธํ๊ธฐ
}
๊ฒฐ๊ด๊ฐ ์ถ๋ ฅํ๊ธฐ
//๋ณ๋ ํจ์
Add(๋ฌธ์ ๋ํ๊ธฐ ํจ์)
{
์๋ก ๋ค์ด์จ ๋ฌธ์๋ฅผ myArr์ ์
๋ฐ์ดํธํ๊ฑฐ๋ checkSecret ๊ฐ ๋ณ๊ฒฝํ๊ธฐ
}
Remove(๋ฌธ์ ๋นผ๊ธฐ ํจ์)
{
์ ๊ฑฐ๋๋ ๋ฌธ์๋ฅผ myArr์ ์
๋ฐ์ดํธํ๊ฑฐ๋ checkSecret ๊ฐ ๋ณ๊ฒฝํ๊ธฐ
}
์ฝ๋
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import java.io.*;
import java.util.*;
public class Q12891_DNA๋น๋ฐ๋ฒํธ {
static int checkArr[]; // ๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด
static int myArr[]; // ํ์ฌ์ํ ๋ฐฐ์ด
static int checkSecret; // ๋ช ๊ฐ์ ๋ฌธ์์ ๊ด๋ จ๋ ๊ฐ์๋ฅผ ์ถฉ์กฑํ๋์ง ํ๋จํ๋ ๋ณ์
public static void main(String[] args) throws NumberFormatException, 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()); // ๋ถ๋ถ ๋ฌธ์์ด์ ํฌ๊ธฐ
int Result = 0;
char ArrS[];
checkArr = new int[4]; // ๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด, ๋ช๊ฐ์ ์ํ๋ฒณ์ด ํ์ํ์ง
myArr = new int[4]; // ํ์ฌ์ํ ๋ฐฐ์ด
checkSecret = 0; // ๋ช ๊ฐ์ ๋ฌธ์์ ๊ด๋ จ๋ ๊ฐ์๋ฅผ ์ถฉ์กฑํ๋์ง ํ๋จํ๋ ๋ณ์
ArrS = br.readLine().toCharArray(); // (2๋ฒ์งธ ์ค) ArrS[] = {C, C, T, G, G, A, T, T, G}
st = new StringTokenizer(br.readLine()); //
for (int i = 0; i < 4; i++) {
checkArr[i] = Integer.parseInt(st.nextToken()); // (3๋ฒ์งธ ์ค) checkArr[] = {2, 0, 1, 1}
if (checkArr[i] == 0)
checkSecret++; // ์ด๋ฏธ ์กฐ๊ฑด์ ์ถฉ์กฑํ์ผ๋ 1
}
for (int i = 0; i < P; i++) { // ์ด๊ธฐ P ๋ถ๋ถ ๋ฌธ์์ด ์ฒ๋ฆฌ ๋ถ๋ถ
Add(ArrS[i]);
}
if (checkSecret == 4) // ์นด์ดํธ ๋ง์กฑ ์กฐ๊ฑด, 4๊ฐ์ ๋ฌธ์๊ฐ ๋ชจ๋ ์กฐ๊ฑด์ ๋ง์กฑ 1+1+1+1
Result++;
// ์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์ฒ๋ฆฌ ๋ถ๋ถ
for (int i = P; i < S; i++) {
int j = i - P;
Add(ArrS[i]);
Remove(ArrS[j]);
if (checkSecret == 4) // 4์๋ฆฟ์์ ๊ด๋ จ๋ ํฌ๊ธฐ๊ฐ ๋ชจ๋ ์ถฉ์กฑ๋ ๋ ์ ํจํ ๋น๋ฐ๋ฒํธ
Result++;
}
System.out.println(Result);
br.close();
}
private static void Add(char c) { // ์๋ก ๋ค์ด์จ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์
switch (c) {
case 'A':
myArr[0]++;
if (myArr[0] == checkArr[0])
checkSecret++;
break;
case 'C':
myArr[1]++;
if (myArr[1] == checkArr[1])
checkSecret++;
break;
case 'G':
myArr[2]++;
if (myArr[2] == checkArr[2])
checkSecret++;
break;
case 'T':
myArr[3]++;
if (myArr[3] == checkArr[3])
checkSecret++;
break;
}
}
private static void Remove(char c) { // ์ ๊ฑฐ๋๋ ๋ฌธ์๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์
switch (c) {
case 'A':
if (myArr[0] == checkArr[0])
checkSecret--;
myArr[0]--;
break;
case 'C':
if (myArr[1] == checkArr[1])
checkSecret--;
myArr[1]--;
break;
case 'G':
if (myArr[2] == checkArr[2])
checkSecret--;
myArr[2]--;
break;
case 'T':
if (myArr[3] == checkArr[3])
checkSecret--;
myArr[3]--;
break;
}
}
/*
----- ์์ ์
๋ ฅ 1 -----
9 8
CCTGGATTG
2 0 1 1
----- ์์ ์ถ๋ ฅ 1 -----
0
----- ์์ ์
๋ ฅ 2 -----
4 2
GATA
1 0 0 1
----- ์์ ์ถ๋ ฅ 2 -----
2
*/
}