내가 자주 틀리는 알고리즘 유형 정리 🤷♂️
Hash, sliding window : 시간복잡도 O(n)
key point는 pointer 개념을 이용해서 풀어야한다.
- 초기값 세팅시 -1 만큼 map에 저장
- 방향 lp, rp 개념을 이용하기
- String에 저장하기보단 동적 메모리 arraylist를 쓰자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Map<Character, Integer> map = new HashMap<>(); Map<Character, Integer> compare = new HashMap<>(); int counter = 0; //초기값 세팅 for (int i = 0 ; i < word.length() ; i++){ map.put(word.charAt(i), map.getOrDefault(word.charAt(i),0)+1); compare.put(str.charAt(i), compare.getOrDefault(str.charAt(i), 0) + 1); } compare.put(str.charAt(word.length() - 1), compare.getOrDefault(str.charAt(word.length() - 1),0)-1); int lp = 0; // 왼쪽 좌표 for (int rp = word.length() - 1; rp < str.length(); rp++) { char Rchar = str.charAt(rp); char Lchar = str.charAt(lp); compare.put(Rchar, compare.getOrDefault(Rchar,0)+1); //rp 한칸 전진 if(map.equals(compare)) counter++; compare.put(Lchar, compare.getOrDefault(Lchar,0)- 1); //왼쪽 값 삭제 if(compare.get(Lchar)==0) compare.remove(Lchar); lp++; } System.out.println(counter);
재귀함수 메모이제이션
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import java.io.*;
import java.util.*;
public class Main {
static int[] fibo;
private static int solution(int i) {
if(fibo[i]>0) return fibo[i]; // 메모이제이션 포인트
//어차피 배열은 0으로 세팅되어있는데 값이 바뀌면 계산해놓은걸 참고해서 쓰면 좋지않은가
if (i == 1) return fibo[i] = 1;
else if (i == 2) return fibo[i] = 1;
else return fibo[i] = solution(i - 2) + solution(i - 1);
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int i = Integer.parseInt(br.readLine());
fibo = new int[i + 1];
solution(i);
for (int x = 1 ; x < fibo.length ; x++)
System.out.printf(fibo[x]+" ");
}
}