์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[ํ•ด์‰ฌ, ํˆฌํฌ์ธํ„ฐ, ์Šฌ๋ผ์ด๋”ฉ] 4. ๋ชจ๋“  ์•„๋‚˜๊ทธ๋žจ ์ฐพ๊ธฐ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2024. 1. 6. 18:50
4. ๋ชจ๋“  ์•„๋‚˜๊ทธ๋žจ ์ฐพ๊ธฐ
 

์„ค๋ช…

S๋ฌธ์ž์—ด์—์„œ T๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ด ๋˜๋Š” S์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์„ธ์š”.

์•„๋‚˜๊ทธ๋žจ ํŒ๋ณ„์‹œ ๋Œ€์†Œ๋ฌธ์ž๊ฐ€ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. ๋ถ€๋ถ„๋ฌธ์ž์—ด์€ ์—ฐ์†๋œ ๋ฌธ์ž์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ž…๋ ฅ

์ฒซ ์ค„์— ์ฒซ ๋ฒˆ์งธ S๋ฌธ์ž์—ด์ด ์ž…๋ ฅ๋˜๊ณ , ๋‘ ๋ฒˆ์งธ ์ค„์— T๋ฌธ์ž์—ด์ด ์ž…๋ ฅ๋ฉ๋‹ˆ๋‹ค.

S๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋Š” 10,000์„ ๋„˜์ง€ ์•Š์œผ๋ฉฐ, T๋ฌธ์ž์—ด์€ S๋ฌธ์ž์—ด๋ณด๋‹ค ๊ธธ์ด๊ฐ€ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ถœ๋ ฅ

S๋‹จ์–ด์— T๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ด ๋˜๋Š” ๋ถ€๋ถ„๋ฌธ์ž์—ด์˜ ๊ฐœ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ์‹œ ์ž…๋ ฅ 1 

bacaAacba
abc

์˜ˆ์‹œ ์ถœ๋ ฅ 1

3

ํžŒํŠธ

์ถœ๋ ฅ์„ค๋ช…: {bac}, {acb}, {cba} 3๊ฐœ์˜ ๋ถ€๋ถ„๋ฌธ์ž์—ด์ด "abc"๋ฌธ์ž์—ด๊ณผ ์•„๋‚˜๊ทธ๋žจ์ž…๋‹ˆ๋‹ค.

 

 

<<ํ’€์ด>>

 

-๋‚˜์˜ ํ’€์ด- 

 

์‹œ๊ฐ„ ๋ณต์žก๋„ : O(N)

ํ’€์ด 1

 

์ผ๋‹จ ๋‚ด ํ’€์ด๊ฐ€ ๋‘ ๊ฐœ์ธ๋ฐ ใ…‹ใ…‹ ํ•˜๋‚˜๋Š” ์–ด๋””์„ ๊ฐ€ ํ‹€๋ ธ๋‹ค ... ๊ทธ๋ž˜์„œ ์ข€ ๋„์›€์„ ๋ฐ›์•„ ๋‘ ๋ฒˆ์งธ ํ’€์ด๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๋‚˜๋„ ๋‚˜๋ฆ„ ํˆฌํฌ์ธํ„ฐ์™€ ํ•ด์‰ฌ๋ฅผ ์ด์šฉํ•ด์„œ ๊ตฌํ–ˆ๋‹ค.

 

์›๋ฆฌ๋Š” ์šฐ์„  a, b, c ๋ฅผ map์— ๋„ฃ์–ด๋‘๊ณ  ๋น„๊ตํ•˜๋ฉด์„œ ๊ฐ™์€๊ฒŒ ์žˆ๋‹ค๋ฉด -1 ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ–ˆ๊ณ , ์ตœ์ข…์ ์œผ๋กœ value๊ฐ€ ์ „๋ถ€๋‹ค 0์ด๋˜๋ฉด count++๋˜๋Š” ์‹์œผ๋กœ ํ–ˆ๋‹ค.

 

๊ทผ๋ฐ, ๊ณ„์† ํ‹€๋ ค์„œ ์›์ธ์„ ํŒŒ์•…ํ–ˆ๋”๋‹ˆ 

import java.util.*;

class Main {

    public int solution(String str, String target) {
        HashMap<Character, Integer> map = new HashMap<>();
        int lt = 0, count = 0;
        for(char x : target.toCharArray()) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }

        char[] arr = str.toCharArray();


        for(int rt = lt + 1; rt < lt + str.length(); rt++) {
            map.put(arr[rt], map.getOrDefault(map.get(arr[rt]), 0) - 1);
            if(map.size() > target.length() || map.get(arr[rt]) < 0) {
                lt++;
                rt = lt + 1;
                map.clear();
                continue;
            }
            if(rt == lt + str.length() - 1) {
                count++;
                lt++;
                rt = lt + 1;
                map.clear();
            }
        }

        return count;
    }


    public static void main(String[] args ){
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        String target = in.next();

        System.out.println(T.solution(str, target));
    }
}

 

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 9 out of bounds for length 9
at Main.solution(Main.java:16)
at Main.main(Main.java:41)

์ด๋Ÿฐ ์˜ค๋ฅ˜๊ฐ€ ๋œฌ๋‹ค ใ…  ๋งˆ์Œ ๊ฐ™์•„์„œ ํ•˜๋‚˜ํ•˜๋‚˜ ์ฐพ์•„์„œ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ์‹ถ์ง€๋งŒ, ๋‹ค๋ฅธ ๊ฒƒ๋„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ์„ ๊ธฐ์•ฝํ•˜๋ฉฐ ์ผ๋‹จ ๋„˜์–ด๊ฐ„๋‹ค !!

 

ํ’€์ด 2

 

์‹œ๊ฐ„ ๋ณต์žก๋„ = O(N)

 

์šฐ์„  ์ •๋‹ต!

 

์ด๋ ‡๊ฒŒ ๋‚˜์™”๋‹ค. ์•„์ง ์ •ํ™•ํ•˜๊ฒŒ ์›์ธ์ด ๋ฌด์—‡์ธ์ง€๋Š” ์•Œ ์ˆ˜ ์žˆ์ง€๋งŒ, ํ’€์ด2์˜ ์ฝ”๋“œ๋Š” ์ง๊ด€์ ์œผ๋กœ ๋ณด์ธ๋‹ค.

 

๋‚ด๊ฐ€ ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋˜ ๋ฐฉ์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์ง€๋งŒ ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.

 

๋ฉ”์„œ๋“œ๋ฅผ ๋‘ ๋ฒˆ ์‚ฌ์šฉํ–ˆ๋‹ค. ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ๊ฐ€ ๋˜ ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ’์„ ๋„์ถœ ํ•œ ํ›„, ์ตœ์ข… ์‹คํ–‰ ํด๋ž˜์Šค์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

 

์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ฑฐ๋‚˜ ํ•˜๋ฉด ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜ ๋” ๋งŒ๋“ค์–ด์„œ ์ง„ํ–‰ํ•˜๋ฉด ์ข‹๋‹ค !!!

 
import java.util.*;

class Main {

    public int solution(String str, String target) {
        HashMap<Character, Integer> map = new HashMap<>();
        int lt = 0, count = 0, targetLen = target.length();

        // target์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๋งต์— ์ถ”๊ฐ€
        for(char x : target.toCharArray()) {
            map.put(x, map.getOrDefault(x, 0) + 1);
        }

        char[] arr = str.toCharArray();
        int windowSize = 0;

        // ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์„ ์ˆœํšŒ
        for(int rt = 0; rt < arr.length; rt++) {
            char ch = arr[rt];
            // ํ˜„์žฌ ๋ฌธ์ž๊ฐ€ target์— ์žˆ๋Š” ๊ฒฝ์šฐ, ๋งต์—์„œ ํ•˜๋‚˜ ์ค„์ž„
            map.put(ch, map.getOrDefault(ch, 0) - 1);
            windowSize++;

            // ์œˆ๋„์šฐ ํฌ๊ธฐ๊ฐ€ target์˜ ๊ธธ์ด์™€ ๊ฐ™์•„์ง€๋ฉด
            if(windowSize == targetLen) {
                // ์œˆ๋„์šฐ ๋‚ด ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ target์— ์žˆ๋Š”์ง€ ํ™•์ธ
                if(isAllZero(map)) {
                    count++;
                }
                // lt ์œ„์น˜์˜ ๋ฌธ์ž๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€
                map.put(arr[lt], map.getOrDefault(arr[lt], 0) + 1);
                lt++;
                windowSize--;
            }
        }

        return count;
    }

    // ๋งต์˜ ๋ชจ๋“  ๊ฐ’์ด 0์ธ์ง€ ํ™•์ธํ•˜๋Š” ํ•จ์ˆ˜
    private boolean isAllZero(HashMap<Character, Integer> map) {
        for(int value : map.values()) {
            if(value != 0) return false;
        }
        return true;
    }

    public static void main(String[] args ){
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        String target = in.next();

        System.out.println(T.solution(str, target));
    }
}

 

 if(windowSize == targetLen) {
                // ์œˆ๋„์šฐ ๋‚ด ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ target์— ์žˆ๋Š”์ง€ ํ™•์ธ

                if(isAllZero(map)) {
                    count++;
                }
                // lt ์œ„์น˜์˜ ๋ฌธ์ž๋ฅผ ๋‹ค์‹œ ์ถ”๊ฐ€
                map.put(arr[lt], map.getOrDefault(arr[lt], 0) + 1);
                lt++;
                windowSize--;
            }
        }

 

์ด ๋ถ€๋ถ„์ด ์ดํ•ด๊ฐ€ ์•ˆ ๋˜์—ˆ๋Š”๋ฐ, ์ž˜ ์‚ดํŽด๋ณด๋ฉด ์šฐ๋ฆฌ๋Š” map์„ ๋ฏธ๋ฆฌ ์ง€์ •ํ•ด๋‘๊ณ  for๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ทธ ๊ฐ’์ด ์žˆ์œผ๋ฉด -1ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋•Œ, ๋๋‚˜๊ณ  ์œˆ๋„์šฐ๊ฐ€ ์ด๋™์„ํ•˜๋ฉด์„œ ์ขŒ์ธก ๊ฐ’์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋‹จ ์ถ”๊ฐ€์‹œ์ผœ์ฃผ๊ณ  lt++๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์•„๋งˆ ๊ธ€๋กœ๋Š” ์ดํ•ดํ•˜๊ธฐ ํž˜๋“ค ์ˆ˜ ์žˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ž˜ ์ฝ๊ณ  ๋…ผ๋ฆฌ์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด ๊ทธ ํ™œ์šฉ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

-๊ฐ•์‚ฌ๋‹˜ ํ’€์ด-

 

import java.util.*;

class Main {

    public int solution(String str, String target) {
      int answer = 0;
      HashMap<Character, Integer> am = new HashMap<>();
      HashMap<Character, Integer> bm = new HashMap<>();
      for (char x : target.toCharArray()) am.put(x, am.getOrDefault(x, 0) + 1);
      int L = target.length() - 1;
      for (int i = 0; i < L; i++) bm.put(str.charAt(i), bm.getOrDefault(str.charAt(i), 0) + 1);
      int lt = 0;
        for (int rt = L; rt < str.length(); rt++) {
            bm.put(str.charAt(rt), bm.getOrDefault(str.charAt(rt), 0) + 1);
            if (bm.equals(am)) answer++;
            bm.put(str.charAt(lt), bm.get(str.charAt(lt)) - 1);
            if (bm.get(str.charAt(lt)) == 0) bm.remove(str.charAt(lt));
            lt++;
        }
        return answer;
    }


    public static void main(String[] args ){
        Main T = new Main();
        Scanner in = new Scanner(System.in);
        String str = in.next();
        String target = in.next();

        System.out.println(T.solution(str, target));
    }
}

 

ํ›„ํ›„ ์—ญ์‹œ ๊น”๋”ํ•˜๊ฒŒ ํ‘ธ์…จ๋‹ค!

 

์—ฌ๊ธฐ์„œ ํŠน์ด์ ์€ equals๋ผ๋Š” ๋ฉ”์„œ๋“œ์ธ๋ฐ ~ ๋‚˜๋„ ์ฒ˜์Œ์—๋Š” ์ด๊ฑธ ์ƒ๊ฐ์€ ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ•ด์‰ฌ๋งต์„ ์‚ฌ์šฉํ•  ๋•Œ ๋„ฃ๋Š” ์ˆœ์„œ๊ฐ€ ๋‹ค๋ฅด๋ฉด ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ์ ธ์„œ equals๊ฐ€ ์•ˆ ๋  ์ค„ ์•Œ์•˜๋‹ค. ํ•˜์ง€๋งŒ ๋„ฃ๋Š” ์ˆœ์„œ ์ƒ๊ด€์—†์ด ์›€์ง์ธ๋‹ค๋Š” ์ !!

 

๋˜ํ•œ, ์Šฌ๋ผ์ด๋”ฉํ• ๋•Œ ๋ฏธ๋ฆฌ ๋น„๊ต ๋Œ€์ƒ ์ „๊นŒ์ง€ ์…‹ํŒ…ํ•˜๊ณ  ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด ๊ตณ์ด ์‚ฌ์ด์ฆˆ๋ฅผ ์„ค์ •ํ•ด๋†“๊ณ  ์‹œ์ž‘ํ•ด์„œ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ฐ™์•„์ง€๋ฉด ~~ ์ด๋ผ๋Š” ๊ตฌ์กฐ๊ฐ€ ์—†์–ด์ง„๋‹ค. ๊ทธ๋ƒฅ ํ•˜๋‚˜ ์ฆ๊ฐ€ํ•˜๊ณ  ๋น„๊ตํ•˜๊ณ  ๊ทธ ๋‹ค์Œ ์ง„ํ–‰ํ•˜๊ณ  ์ด๋Ÿฐ์‹์ด๋‹ค.

 

์™œ ์ดˆ๊ธฐ ์…‹ํŒ…์„ ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

์ฒ˜์Œ์— ํˆฌํฌ์ธํ„ฐ์™€ ์–ด๋–ค ์ ์ด ๊ทธ๋ ‡๊ฒŒ ๋‹ค๋ฅธ๊ฐ€ ์ƒ๊ฐํ–ˆ๋Š”๋ฐ ์ด๊ฒƒ์ด ์Šฌ๋ผ์ด๋”ฉ ์œˆ๋„์šฐ๋ฅผ ์ œ๋Œ€๋กœ ํ™œ์šฉํ•œ ์ ์ธ๊ฐ€ ์‹ถ๋‹ค!!

 

์˜ค๋Š˜๋„ ๋ฐฐ์›Œ๊ฐ‘๋‹ˆ๋‹น