equals() 사용 시 시간 복잡도 관련 질문
131
작성한 질문수 4
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 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 인턴입니다. shshjkjk님.
질문해 주신 내용은 자바의 Map 인터페이스에서 equals() 메소드를 사용했을 때의 시간 복잡도와 관련된 것입니다. 일반적으로 equals() 메서드는 두 맵의 엔트리를 비교하므로 O(n) 시간 복잡도를 갖습니다. 따라서 각 루프 내에서 equals()를 호출하면 전체적으로 O(n^2) 복잡도가 발생할 수 있습니다.
결국 이것은 입력이 크면 성능 문제를 야기할 수 있다는 것을 의미하죠. 그래서 다른 방법으로 접근했을 때 테스트를 통과했다면 성능 측면에서 이점이 있는 것일 수 있습니다.
제시해 주신 대체 방법(코드)에서 예외를 찾기 위해서는 여러 예제와 경계 조건을 테스트해 보는 것이 좋습니다. 현재 코드에서는 targetMap을 활용하여 탐색 범위 내 문자 빈도를 조정하여 아나그램을 찾는 방식입니다. 이러한 방식은 equals() 호출을 줄이기 때문에 효율적일 수 있으며, O(n)의 시간 복잡도를 가지게 되어 일반적으로 더 빠른 성능을 보입니다.
다음의 링크에서 같은 주제의 정보를 확인할 수 있습니다:
- 강사님 테스트 5번만 오답으로 뜨는데 틀린점을 못 찾겠습니다
- 왜틀린지 아무리 봐도 모르겠습니다 ㅠ
- 강사님 코드리뷰 한번해주실수있나요 !! (섹션 5의 8번 문제입니다)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
안녕하세요. 바뀐 채점사이트 관련해서 문의드립니다.
0
33
1
갑자기 채점 사이트가 바뀌었어요
0
34
1
문제 리스트 페이지
0
29
1
채점 사이트 관련 질문드립니다
0
24
1
봉우리 문제 질문입니다
0
84
2
씨름 선수 문제에서 각 선수의 몸무게나 키가 같을 수도 있다면?
0
65
0
이 코드랑 영상 코드중에 뭐가 더 좋은 코드인가요?
0
72
0
가중치 방향 그래프에서 가중치가 0인 간선을 표현하는 방법
0
67
1
좌표 정렬 문제 이 코드가 왜 틀린지 모르겠습니다 ㅠㅠ
0
85
2
6-7 강의에서
0
48
1
6-6. 장난꾸러기 질문 있습니다.
0
46
1
강의 수강후 코딩테스트
0
111
1
answer 변수 사용 여부
0
46
1
2중 for문
1
85
2
2-11. 임시반장정하기 (Runtime Error)
0
63
1
혹시 LinkedList 같은 자료 구조들은 따로 배우지 않나요?
0
70
1
이런 풀이는 어떨까요
0
44
1
자바 스트림 방식의 효율성 질문 드립니다.
0
57
1
알고리즘 자료 구조들..
0
63
1
StringBuilder vs BufferdWriter
0
48
1
원더랜드(프림)
0
50
1
이런 코드는 어떤가요?
0
61
1
bfs 풀이
0
57
1
병합정렬
0
57
1





