[BOJ] DNA ๋น„๋ฐ€๋ฒˆํ˜ธ - ๋ฐฑ์ค€ 12891 (์ž๋ฐ” JAVA)- ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

    ๐Ÿ“Œ ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ

    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

     

     

    728x90

    ๋Œ“๊ธ€