โ˜•Java

[JAVA] ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ (๋ฐฑ์ค€ 12891๋ฒˆ)

์†Œ์˜ ๐Ÿ€ 2025. 5. 22. 09:05

์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 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);
        
    }
}

 

 

 

 

๋ฐ˜์‘ํ˜•