작성
·
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 인턴입니다. shshjkjk님.
질문해 주신 내용은 자바의 Map
인터페이스에서 equals()
메소드를 사용했을 때의 시간 복잡도와 관련된 것입니다. 일반적으로 equals()
메서드는 두 맵의 엔트리를 비교하므로 O(n) 시간 복잡도를 갖습니다. 따라서 각 루프 내에서 equals()
를 호출하면 전체적으로 O(n^2) 복잡도가 발생할 수 있습니다.
결국 이것은 입력이 크면 성능 문제를 야기할 수 있다는 것을 의미하죠. 그래서 다른 방법으로 접근했을 때 테스트를 통과했다면 성능 측면에서 이점이 있는 것일 수 있습니다.
제시해 주신 대체 방법(코드)에서 예외를 찾기 위해서는 여러 예제와 경계 조건을 테스트해 보는 것이 좋습니다. 현재 코드에서는 targetMap
을 활용하여 탐색 범위 내 문자 빈도를 조정하여 아나그램을 찾는 방식입니다. 이러한 방식은 equals()
호출을 줄이기 때문에 효율적일 수 있으며, O(n)의 시간 복잡도를 가지게 되어 일반적으로 더 빠른 성능을 보입니다.
다음의 링크에서 같은 주제의 정보를 확인할 수 있습니다:
- 강사님 테스트 5번만 오답으로 뜨는데 틀린점을 못 찾겠습니다
- 왜틀린지 아무리 봐도 모르겠습니다 ㅠ
- 강사님 코드리뷰 한번해주실수있나요 !! (섹션 5의 8번 문제입니다)
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.