강의

멘토링

커뮤니티

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

궁콘이님의 프로필 이미지
궁콘이

작성한 질문수

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

3. 매출액의 종류(Hash, sliding window)

선생님 질문있습니다.

작성

·

150

1

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

public class Main {

static void Solution(int n, int k, int[] arr){

int lt = 0;
HashMap<Integer,Integer> map = new HashMap<>();
for (int i = 0; i < k; i++) {
map.put(arr[i],map.getOrDefault(arr[i],0)+1);
}
String result = map.size()+" ";
for (int rt = k; rt < n; rt++) {
map.put(arr[rt],map.getOrDefault(arr[rt],0)+1);
map.put(arr[lt],map.getOrDefault(arr[lt],1)-1);
if(map.get(arr[lt]) == 0) map.remove(arr[lt]);
result += map.size()+" ";
lt++;
}
System.out.println(result);
}

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
Solution(n, k, arr);
}
}

선생님, 만약 k = 4일때 강의에서는 0~2번까지만 미리 구해서 map에 넣어둔 상태에서 아래 투포인트 for문에서

1. rt값 더하고 

2. map.size() 입력하고

3. lt값 빼고 , lt == 0 체크 

이런식으로 진행하시는데 

제 로직은 첫for문에서 0~3까지 다 구해놓고 처음 map.size()를 초기값으로 준 후 다음 투포인트 for문에서

1. rt값 더하고

2. lt값 뺴고, lt == 0 체크

3. map.size() 입력하고 

이렇게 로직을 구현했는데 TimeLimit이 발생하네요.

결국에는 그림으로 설명해주신것 처럼 네칸씩 구하는

방식은 똑같은것 같은데 이유를 알 수 있을까요..

답변 1

0

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

안녕하세요^^

답을 result라는 스트링에 처리하면 속도가 떨어집니다.

다음 글을 참조하세요.

https://jaehun2841.github.io/2019/03/01/effective-java-item63/#%EC%84%9C%EB%A1%A0

ArrayList<Integer> result = new ArrayList<>(); 선언하시고

ArrayList에 add한 후 출력하시면 통과될겁니다.

궁콘이님의 프로필 이미지
궁콘이
질문자

오! 감사합니다. 선생님은 천재십니다.

궁콘이님의 프로필 이미지
궁콘이

작성한 질문수

질문하기