[JAVA] ์ฌ๋ผ์ด๋ฉ ์๋์ฐ (๋ฐฑ์ค 12891๋ฒ)
์ฌ๋ผ์ด๋ฉ ์๋์ฐ ์๊ณ ๋ฆฌ์ฆ์ 2๊ฐ์ ํฌ์ธํฐ๋ก ๋ฒ์๋ฅผ ์ง์ ํ ๋ค์ ๋ฒ์๋ฅผ ์ ์งํ ์ฑ๋ก ์ด๋ํ๋ฉฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
์ด๋ ๋ฒ์๊ฐ ์๋์ฐ๊ฐ ๋๊ณ , ์ด๋ํ๋ ๊ฒ์ ์ฌ๋ผ์ด๋ฉ์ด๋ผ๊ณ ํฉ๋๋ค.
ํฌ ํฌ์ธํฐ ์๊ณ ๋ฆฌ์ฆ๊ณผ ๋น์ทํฉ๋๋ค.
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| ๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์์ด ๋ณด์ฅ๋๋ค.
์ถ๋ ฅ)
์ฒซ ๋ฒ์งธ ์ค์ ๋ฏผํธ๊ฐ ๋ง๋ค ์ ์๋ ๋น๋ฐ๋ฒํธ์ ์ข ๋ฅ์ ์๋ฅผ ์ถ๋ ฅํด๋ผ.
์ด ์์๋ก ๋ค์ ๋ฌธ์ ๋ฅผ ์ดํดํด๋ด ์๋ค.
GATA๋ผ๋ ๊ธธ์ด 4์ DNA ๋ฌธ์์ด์์๋
๋ค์๊ณผ ๊ฐ์ ๊ธธ์ด 2์ ๋ถ๋ถ๋ฌธ์์ด์ ๋ฝ์ ์ ์์ต๋๋ค.
"GA", "AT", "TA"
์ด๋ A๋ฅผ 1๊ฐ ์ด์, C๋ฅผ 0๊ฐ ์ด์, G๋ฅผ 0๊ฐ ์ด์, T๋ฅผ 1๊ฐ ์ด์ ํฌํจํ๋ ๋ฌธ์์ด์
"AT", "TA" 2๊ฐ์ด๋ฏ๋ก ๋ต์ 2์ ๋๋ค.
์ด์ฒ๋ผ ์ผ์ ํ ํฌ๊ธฐ์ ํน์ ๋ฒ์(์๋์ฐ)๋งํผ ํ์ธํ๋ฉฐ ์์ผ๋ก ์ด๋(์ฌ๋ผ์ด๋ฉ)ํ๋ ๊ฒ์ด ์ฌ๋ผ์ด๋ฉ ์๋์ฐ์ ๋๋ค.
(1 ≤ |P| ≤ |S| ≤ 1,000,000)๋ก n์ ํฌ๊ธฐ๊ฐ 1,000,000์ด๋ฉด ์๋นํ ํฌ๋ค. ์๊ฐ๋ณต์ก๋๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ด์ฉํ๋ฉด ์ด๋ O(n)์ ์๊ฐ ๋ณต์ก๋๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
์ด ํฌ๊ธฐ๋งํผ ์ด๋ํ๋ฉฐ ์๋์ฐ ์์ ์๋ ๋ถ๋ถ๋ฌธ์์ด์ด ์กฐ๊ฑด์ ๋ง์กฑํ๋ฉด count++์ ํ๊ณ ์์ผ๋ก ์ฌ๋ผ์ด๋ฉํ๋ฉด ๋ฉ๋๋ค.
์์ผ๋ก ํ์ด ๋ณด๊ธฐ
DNA๋ฌธ์์ด์ธ S๋ฐฐ์ด๊ณผ ๋น๋ฐ๋ฒํธ ์กฐ๊ฑด์ ๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด๋ก ์ ์ฅํฉ๋๋ค.
๋ถ๋ถ๋ฌธ์์ด์ ์๋ผ๋ด์ ๋ฌธ์์ด ๋ด A, C, G, T์ ๊ฐ์๋ฅผ ๊ตฌํด ์๋ก์ด ์ํ ๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค.
์ด ๋ฐฐ์ด๊ณผ ๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด์ ๋น๊ตํ์ ๋ ํ๋๋ผ๋ ์์ผ๋ฉด ์กฐ๊ฑด์ ๋ง์กฑํ์ง ๋ชปํ ๊ฒ๋๋ค.
์๋์ฐ๋ฅผ ์ฌ๋ผ์ด๋ฉํ๋ฉด?
๊ทธ๋ผ ๋ถ๋ถ๋ฌธ์์ด์์ ๊ฐ์ฅ ์ ๊ธ์ ํ๋๊ฐ ๋น ์ง๊ณ , ๋ค์ ์๋ก์ด ๊ธ์๊ฐ ํ๋ ์ถ๊ฐ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ ์ฒซ ๋ฒ์งธ ์๋์ฐ์์๋ง ์ํ ๋ฐฐ์ด์ ๊ตฌํ๊ณ , ์ดํ์๋ ๋น ์ง๊ฑฐ๋ ์๋กญ๊ฒ ์ถ๊ฐ๋๋ ๊ธ์์ ๋ํด์๋ง
์์๊ฐ์ ์ฌ๋ฆฌ๊ฑฐ๋ ๋ด๋ฆฌ๋ฉด ๋ฉ๋๋ค. ์ฆ, ๋งค๋ฒ ๋ถ๋ถ๋ฌธ์์ด ๋ด ๊ธ์๋ณ ์๋ฅผ ์ ํ์๊ฐ ์์ต๋๋ค.
1. DNA๋ฌธ์์ด ๊ธธ์ด |S|, ๋ถ๋ถ๋ฌธ์์ด ๊ธธ์ด |P| ์
๋ ฅ ๋ฐ๊ธฐ
2. DNA๋ฌธ์์ด S ์
๋ ฅ ๋ฐ๊ธฐ
3. {A, C, G, T} ์ ์
๋ ฅ ๋ฐ์ ๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด ์ ์ฅํ๊ธฐ
4. ์๋์ฐ ์ธ๋ฑ์ค start_index = 0, end_index = P-1๋ก ์์ํ๊ธฐ
5. ์ฒซ ๋ฒ์งธ ๋ถ๋ถ๋ฌธ์์ด(์๋์ฐ) ์ถ์ถํ๊ธฐ
6. ๋ถ๋ถ๋ฌธ์์ด ๋ด A, C, G, T ๊ฐ์ ์ธ์ ์ํ ๋ฐฐ์ด์ ์ ์ฅํ๊ธฐ
7. end_index๊ฐ S์ ๋ง์ง๋ง ์ธ๋ฑ์ค์ ๋ฌํ ๋๊น์ง ์๋ ๊ณผ์ ์ ๋ฐ๋ณต
8. ๋น๋ฐ๋ฒํธ ์ฒดํฌ ๋ฐฐ์ด๊ณผ ์ํ ๋ฐฐ์ด ๋น๊ตํ์ฌ ์กฐ๊ฑด ๋ง์กฑํ๋์ง ํ์ธ
9. ์กฐ๊ฑด ๋ง์กฑํ๋ฉด count++
10. ์ํ ๋ฐฐ์ด์์ S[start_index]์ ํด๋นํ๋ ๊ฒ ๋นผ๊ธฐ
11. start_index++; end_index++;
12. ์ํ ๋ฐฐ์ด์์ S[end_index]์ ํด๋นํ๋ ๊ฒ ๋ํ๊ธฐ
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int S_length = scanner.nextInt();
int P_length = scanner.nextInt();
String str = scanner.next();
char[] S = str.toCharArray();
int[] check = new int[4];
for(int i=0; i<4; i++) {
check[i] = scanner.nextInt();
}
int start_index = 0;
int end_index = P_length-1;
int[] status = new int[4];
for(int index = start_index; index<=end_index; index++) {
if(S[index] == 'A') status[0] = status[0] + 1;
else if(S[index] == 'C') status[1] = status[1] + 1;
else if(S[index] == 'G') status[2] = status[2] + 1;
else if(S[index] == 'T') status[3] = status[3] + 1;
}
int count = 0;
while(end_index < S_length) {
if(status[0] >= check[0] &&
status[1] >= check[1] &&
status[2] >= check[2] &&
status[3] >= check[3]) count++;
if(S[start_index] == 'A') status[0] = status[0] - 1;
else if(S[start_index] == 'C') status[1] = status[1] - 1;
else if(S[start_index] == 'G') status[2] = status[2] - 1;
else if(S[start_index] == 'T') status[3] = status[3] - 1;
start_index++;
end_index++;
if(end_index>=S_length) break;
if(S[end_index] == 'A') status[0] = status[0] + 1;
else if(S[end_index] == 'C') status[1] = status[1] + 1;
else if(S[end_index] == 'G') status[2] = status[2] + 1;
else if(S[end_index] == 'T') status[3] = status[3] + 1;
}
System.out.println(count);
}
}