인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

shshjkjk님의 프로필 이미지

작성한 질문수

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

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

equals() 사용 시 시간 복잡도 관련 질문

작성

·

82

0

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

안녕하세요 강사님 좋은 강의 항상 감사드립니다.

해당 문제에서 시간 복잡도 관련 질문이 있습니다!

map의 equals() 는 내부적으로 O(n)의 복잡도를 가진 메소드로 알고 있습니다! 내부 구현 코드도 entrySet을 통해서 반복문으로 찾는 과정이 있는 것 같은데요!

그렇다면 for문 안에 equals()를 사용할 경우 O(n^2)이 되는 것이 아닌지 질문 드리고 싶습니다! equals가 평균적으로 n 까지 가지 않기 때문에 제외 되는 것일까요?

추가적으로 equals() 를 사용하지 않고 풀이를 해봤습니다! 채점을 했을 땐 통과를 하였는데.. 혹시 이 방법에 예외가 있을까요?

 

import java.util.HashMap;
import java.util.Scanner;

public class Main {
    private static void solution(String s, String t) {
        int idx1 = 0;
        int answer = 0;
        int cnt = 0;
        HashMap<Character, Integer> targetMap = new HashMap<>();
        for (char c : t.toCharArray()) {
            targetMap.put(c, targetMap.getOrDefault(c, 0) + 1);
        }

        for (int i = 0; i < s.length(); i++) {
            char key = s.charAt(i);
            if (targetMap.containsKey(key)) {
                int value = targetMap.get(key);
                if (value == 0) {
                    cnt--;
                }
                targetMap.put(key, --value);
                if (value == 0) {
                    cnt++;
                }
            }
            if (i >= t.length()) {
                char backKey = s.charAt(idx1++);
                if (targetMap.containsKey(backKey)) {
                    int value = targetMap.get(backKey);
                    if (value == 0) {
                        cnt--;
                    }
                    targetMap.put(backKey, ++value);
                    if (value == 0) {
                        cnt++;
                    }

                }
            }
            if (cnt == targetMap.size()) {
                answer++;
            }
        }
        System.out.println(answer);
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        String t = sc.next();
        solution(s, t);

    }
}

답변 2

0

김태원님의 프로필 이미지
김태원
지식공유자

안녕하세요^^

map에서 제공하는 equals()의 시간복잡도는 저도 정확히 알고 있지는 않습니다. 죄송합니다.

equals() 가 O(n)이면 영상의 방법은 O(n^2)이 맞습니다.

예전에 자바스크립트 강의에서도 같은 질문이 있어 아래 코드와 같이 시간복잡도가 O(n)같아 보이는 코드를 답면으로 올린적이 있어 다시 올립니다. 아래 코드나 님의 코드나 비슷한 것 같습니다.

참고로 실제 채점사이트에서 채점해보면 영상에서의 해법인 equals()를 사용한 코드나 아래 코드나 각 케이스 별 처리한 시간은 차이가 없었습니다.

import java.util.*;
class Main {	
	public int solution(String a, String b){
		int answer = 0;
		HashMap<Character, Integer> sH = new HashMap<>();
		for(char x : b.toCharArray()) sH.put(x, sH.getOrDefault(x, 0) - 1);
		int L = b.length()-1;
		for(int i = 0; i < L; i++){
			sH.put(a.charAt(i), sH.getOrDefault(a.charAt(i), 0) + 1);
			if(sH.get(a.charAt(i)) == 0) sH.remove(a.charAt(i));
		}
		int lt = 0;
		for(int rt = L; rt < a.length(); rt++){
			sH.put(a.charAt(rt), sH.getOrDefault(a.charAt(rt), 0) + 1);
			if(sH.get(a.charAt(rt)) == 0) sH.remove(a.charAt(rt));
			if(sH.size() == 0) answer++;
			sH.put(a.charAt(lt), sH.getOrDefault(a.charAt(lt), 0) - 1);
			if(sH.get(a.charAt(lt)) == 0) sH.remove(a.charAt(lt));
			lt++;
		}
		return answer;
	}
		

	public static void main(String[] args){
		Main T = new Main();
		Scanner kb = new Scanner(System.in);
		String a = kb.next();
		String b = kb.next();
		System.out.print(T.solution(a, b));
	}
}

 

 

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. shshjkjk님.

질문해 주신 내용은 자바의 Map 인터페이스에서 equals() 메소드를 사용했을 때의 시간 복잡도와 관련된 것입니다. 일반적으로 equals() 메서드는 두 맵의 엔트리를 비교하므로 O(n) 시간 복잡도를 갖습니다. 따라서 각 루프 내에서 equals()를 호출하면 전체적으로 O(n^2) 복잡도가 발생할 수 있습니다.

결국 이것은 입력이 크면 성능 문제를 야기할 수 있다는 것을 의미하죠. 그래서 다른 방법으로 접근했을 때 테스트를 통과했다면 성능 측면에서 이점이 있는 것일 수 있습니다.

제시해 주신 대체 방법(코드)에서 예외를 찾기 위해서는 여러 예제와 경계 조건을 테스트해 보는 것이 좋습니다. 현재 코드에서는 targetMap을 활용하여 탐색 범위 내 문자 빈도를 조정하여 아나그램을 찾는 방식입니다. 이러한 방식은 equals() 호출을 줄이기 때문에 효율적일 수 있으며, O(n)의 시간 복잡도를 가지게 되어 일반적으로 더 빠른 성능을 보입니다.

다음의 링크에서 같은 주제의 정보를 확인할 수 있습니다:
- 강사님 테스트 5번만 오답으로 뜨는데 틀린점을 못 찾겠습니다
- 왜틀린지 아무리 봐도 모르겠습니다 ㅠ
- 강사님 코드리뷰 한번해주실수있나요 !! (섹션 5의 8번 문제입니다)

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

shshjkjk님의 프로필 이미지

작성한 질문수

질문하기