작성
·
75
·
수정됨
0
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String s = in.nextLine();
String s2 = in.nextLine();
System.out.println(Solution.solution(s, s2));
}
}
class Solution{
public static int solution(String s , String s2){
int ans = 0;
HashMap<Character, Integer> map = new HashMap<>();
HashMap<Character, Integer> map2 = new HashMap<>();
for(char c : s2.toCharArray()){
map2.put(c, map2.getOrDefault(c, 0) + 1);
}
for(int i = 0; i<s2.length(); i++){
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
if(map.equals(map2)){
ans++;
}
for(int i = s2.length(); i < s.length(); i++){
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0)+1);
if(map.get(s.charAt(i- s2.length())) == 1){
map.remove(s.charAt(i- s2.length()));
}else{
map.put(s.charAt(i-s2.length()), map.get(s.charAt(i-s2.length())) - 1);
}
if(map.equals(map2)){
ans++;
}
}
return ans;
}
}
전 강의에서는 항상 기존 b의 길이만큼 먼저 계산을 해주고 비교를 한후에 하나를 추가해주고 기존꺼를 제거하는 방식으로 저는 이해해를 해서 그런식으로 풀고 있었는데
강사님 코드 결론은 마지막에 b길이를 채워 주고나서 비교하고 나서 이전껄 빼고 새로운걸 추가시키고 비교하는 방식으로 하시는거 같은데 방식이 달라 어떤걸 더 봐야할지 모르겠습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
opnice12님께서 올려주신 문제에 대해 설명해드리겠습니다.
현재 사용하신 슬라이딩 윈도우 알고리즘에서는 특정 길이의 윈도우를 유지하며 문자열의 연속된 부분을 검사하는 방법을 사용하고 있습니다. 두 가지 방식의 차이를 설명드리겠습니다.
기존 슬라이딩 윈도우 방식: 먼저 첫 윈도우의 길이만큼 사전에 데이터를 준비하고, 이후 한 단계씩 윈도우를 확장하면서 앞부분을 제거하고 새로운 요소를 추가해가며 검사를 합니다. 이 방식은 초기 윈도우 설정 후, 계속해서 한 요소를 제거하고 하나를 추가하면서 체크하는 방식입니다.
차이가 있는 방식: 질문하신 코드에서는 초기 데이터를 구성하고, 그 후에 새 요소를 포함시키고 제거하는 순서로 진행됩니다. 이는 b
의 길이를 채우고 나서 비교 후 추가 및 제거하는 방식으로 느껴질 수 있습니다. 그러나 실제로는 두 방식 모두 기본적으로 슬라이딩 윈도우를 사용하는 동일한 접근법입니다.
두 방식 모두 유효하며, 성능상 큰 차이는 없습니다. 따라서 어떤 방식이 본인의 사고방식에 더 맞는지에 따라 선택하시면 됩니다. 다만, 가독성과 이해도를 높이기 위해서는 레퍼런스로 제공된 코드와 설명을 비교하며 적절한 방식을 선택하는 것이 중요합니다.
강의나 다른 관련 자료에서 해당 알고리즘의 기본 원리를 이해하신 후 자신의 코드로 변형하는 연습을 해보시는 것도 좋습니다. 관련된 추가 자료를 참고하셔도 좋습니다.
도움이 되셨길 바랍니다! 추가 궁금한 점이 있으시면 언제든지 문의해 주세요.