[ํด์ฌ, ํฌํฌ์ธํฐ, ์ฌ๋ผ์ด๋ฉ] 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๊ฐ ์ ๋ ์ค ์์๋ค. ํ์ง๋ง ๋ฃ๋ ์์ ์๊ด์์ด ์์ง์ธ๋ค๋ ์ !!
๋ํ, ์ฌ๋ผ์ด๋ฉํ ๋ ๋ฏธ๋ฆฌ ๋น๊ต ๋์ ์ ๊น์ง ์ ํ ํ๊ณ ์์ํ๊ฒ ๋๋ฉด ๊ตณ์ด ์ฌ์ด์ฆ๋ฅผ ์ค์ ํด๋๊ณ ์์ํด์ ์ฌ์ด์ฆ๊ฐ ๊ฐ์์ง๋ฉด ~~ ์ด๋ผ๋ ๊ตฌ์กฐ๊ฐ ์์ด์ง๋ค. ๊ทธ๋ฅ ํ๋ ์ฆ๊ฐํ๊ณ ๋น๊ตํ๊ณ ๊ทธ ๋ค์ ์งํํ๊ณ ์ด๋ฐ์์ด๋ค.
์ ์ด๊ธฐ ์ ํ ์ ํ๋์ง ์ ์ ์์๋ค.
์ฒ์์ ํฌํฌ์ธํฐ์ ์ด๋ค ์ ์ด ๊ทธ๋ ๊ฒ ๋ค๋ฅธ๊ฐ ์๊ฐํ๋๋ฐ ์ด๊ฒ์ด ์ฌ๋ผ์ด๋ฉ ์๋์ฐ๋ฅผ ์ ๋๋ก ํ์ฉํ ์ ์ธ๊ฐ ์ถ๋ค!!
์ค๋๋ ๋ฐฐ์๊ฐ๋๋น