inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

자바(Java) 알고리즘 문제풀이 입문: 코딩테스트 대비

4. 모든 아나그램 찾기(Hash, sliding window : 시간복잡도 O(n))

안녕하세요 Slice Windoe 방식 질문입니다.

89

opnice12

작성한 질문수 2

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길이를 채워 주고나서 비교하고 나서 이전껄 빼고 새로운걸 추가시키고 비교하는 방식으로 하시는거 같은데 방식이 달라 어떤걸 더 봐야할지 모르겠습니다.

java 코딩-테스트

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다.
opnice12님께서 올려주신 문제에 대해 설명해드리겠습니다.

현재 사용하신 슬라이딩 윈도우 알고리즘에서는 특정 길이의 윈도우를 유지하며 문자열의 연속된 부분을 검사하는 방법을 사용하고 있습니다. 두 가지 방식의 차이를 설명드리겠습니다.

  1. 기존 슬라이딩 윈도우 방식: 먼저 첫 윈도우의 길이만큼 사전에 데이터를 준비하고, 이후 한 단계씩 윈도우를 확장하면서 앞부분을 제거하고 새로운 요소를 추가해가며 검사를 합니다. 이 방식은 초기 윈도우 설정 후, 계속해서 한 요소를 제거하고 하나를 추가하면서 체크하는 방식입니다.

  2. 차이가 있는 방식: 질문하신 코드에서는 초기 데이터를 구성하고, 그 후에 새 요소를 포함시키고 제거하는 순서로 진행됩니다. 이는 b의 길이를 채우고 나서 비교 후 추가 및 제거하는 방식으로 느껴질 수 있습니다. 그러나 실제로는 두 방식 모두 기본적으로 슬라이딩 윈도우를 사용하는 동일한 접근법입니다.

두 방식 모두 유효하며, 성능상 큰 차이는 없습니다. 따라서 어떤 방식이 본인의 사고방식에 더 맞는지에 따라 선택하시면 됩니다. 다만, 가독성과 이해도를 높이기 위해서는 레퍼런스로 제공된 코드와 설명을 비교하며 적절한 방식을 선택하는 것이 중요합니다.

강의나 다른 관련 자료에서 해당 알고리즘의 기본 원리를 이해하신 후 자신의 코드로 변형하는 연습을 해보시는 것도 좋습니다. 관련된 추가 자료를 참고하셔도 좋습니다.

도움이 되셨길 바랍니다! 추가 궁금한 점이 있으시면 언제든지 문의해 주세요.

안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.

0

9

1

갑자기 채점 사이트가 바뀌었어요

0

18

1

문제 리스트 페이지

0

21

1

채점 사이트 관련 질문드립니다

0

18

1

봉우리 문제 질문입니다

0

78

2

씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?

0

62

0

이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?

0

70

0

가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법

0

67

1

좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ

0

81

2

6-7 강의에서

0

47

1

6-6. 장난꾸러기 질문 있습니다.

0

43

1

강의 수강후 코딩테스트

0

106

1

answer 변수 사용 여부

0

42

1

2중 for문

1

83

2

2-11. 임시반장정하기 (Runtime Error)

0

62

1

혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?

0

68

1

이런 풀이는 어떨까요

0

42

1

자바 스트림 방식의 효율성 질문 드립니다.

0

55

1

알고리즘 자료 구조들..

0

59

1

StringBuilder vs BufferdWriter

0

45

1

원더랜드(프림)

0

47

1

이런 코드는 어떤가요?

0

59

1

bfs 풀이

0

55

1

병합정렬

0

54

1