1. 문자열
2. 배열
3. 투포인터 & 슬라이딩 윈도우
4. 해쉬맵 & 트리셋
5. 스택 & 큐
6. 정렬
7. 탐색알고리즘(재귀,그래프,트리,DFS,BFS)
8. 그리디 알고리즘
9. 동적계획법
if(Character.isUpperCase(ch))
if(Character.isLowerCase(ch))
if(Character.isDigit(ch))
bigChar = Character.toUpperCase(smallChar)
smallChar = Character.toLowerCase(bigChar)
string1.equalsIgnoreCase(string2)
int n = c - '0';
int n = Integer.parseInt(str)
이때 맨앞 0은 사라진다.int num = Integer.parseInt(str,n)
String str = Integer.toString(num, n)
long타입의 경우
Long.toString(num, n)
을 이용
String str = String.valueOf(char[] charArr)
for(char c : str.toCharArray){ ... }
for-each문에서 문자열을 사용할때는, CharArray로 바꿔서 반복한다. Math.max(a, b)
활용Math.min(a, b)
활용String[] strs = String.split("CH")
로 "CH"을 기준으로 쪼개진 문자열 배열을 얻는다.String[] strs = String.split("CH", -1)
: limit parameter에 -1을 넣어서 공백을 제거한 부분문자열의 배열을 얻는다.int pos = str.indexOf("CH")
: "CH" 문자가 있는 인덱스를 pos에 반환받는다. 발견하지 못하면, pos에 -1를 리턴한다.String temp = str.substring(index1, index2)
: index1 ~ index1 의 부분 문자열을 temp에 담을 수 있다. String temp = str.substring(index1)
: index1 부터 시작하는 부분 문자열을 temp에 담을 수 있다String result = new StringBuilder(str).reverse().toString()
/* lt, rt를 활용한 로직의 골격 */
public static String function(String str){
int lt = 0;
int rt = str.length()-1;
while(lt < rt){
if(...)
lt++;
else if(...)
rt--;
else{
lt++;
rt--;
}
}
return answer;
}
int temp = nums[i];
int res =0; int t = 0;
while(temp > 0) {
t = temp % 10; // step1
res = res*10 + t; // step2
temp = temp / 10; // step3
}
public static boolean isPrime(int num){
if(num == 1)return false;
for(int i=2; i<num; ++i){
if(num%i==0) return false;
}
return true;
}
public static void main(String[] args) throws IOException {
.... 대충 인덱스가 3이상인 배열을 세팅했음
int GCD = getGCD(arr[0], arr[1]);
for(int i=2; i<arr.length; ++i) {
GCD = getGCD(GCD, arr[i]);
}
}
public static int getGCD(int a, int b) {
if(a%b == 0) {
return b;
} else {
return getGCD(b, a%b);
}
}
public static ArrayList<Integer> twoPointers(int[] arr1, int[] arr2){
ArrayList<Integer> answer = new ArrayList<>();
int l1 = arr1.length; // arr1 길이
int l2 = arr2.length; // arr2 길이
int p1=0, p2=0; // 2개의 포인터
Arrays.sort(arr1); // arr1 정렬
Arrays.sort(arr2); // arr2 정렬
// 하나의 포인터라도 끝까지 갔다면 종료
while(p1<l1 && p2<l2){
// target과 같다면, p1,p2 모두 증가
if(arr1[p1]==arr2[p2]){
answer.add(arr1[p1]);
p1++;
p2++;
} // 값이 작은 포인터를 증가
else if(arr1[p1]<arr2[p2]){
p1++;
}
else{
p2++;
}
}
return answer;
}
public static int slidingWindow(int k, int[] arr){
/* 결과값, window, lt 초기화 */
int answer = 0, sum=0, lt=0;
/* 제1 for문의 iterator를 rt로,
* (rt는 반드시 끝까지 가야함)
*/
for(int rt=0; rt<arr.length; ++rt){ // rt 증가
sum += arr[rt]; // window에 arr[rt] 추가
/* window와 target이 같다면
* answer 증가 후 lt 증가 while문으로 이동
*/
if(sum == k){
answer++;
}
/* lt 증가 while문 */
while(sum >= k){
sum -= arr[lt];
lt++;
if(sum == k)
answer++;
}
}
return answer;
}
// 배열 매핑
map.put(arr[i], map.getOrDefault(arr[i],0)+1); //증가
map.put(arr[i], map.getOrDefault(arr[i],0)-1); //감소
// 문자열 매핑
map.put(str.charAt(i), map.getOrDefault(str.charAt(i),0)+1); //증가
map.put(str.charAt(i), map.getOrDefault(str.charAt(i),0)-1); //감소
remove()
해야 함을 유의해야 한다.if(map.get(str.charAt(i)) == 0)
map.remove(str.charAt(i));
map.size()
map.containsKey(key)
map.containsValue(value)
map.getOrDefault(key,d)
map.remove(key)
new TreeSet<(Collections.reverseOrder())>
tset.add()
tset.remove()
tset.size()
tset.first()
tset.last()
stack.push(object);
stack.pop();
stack.peek();
stack.get(index);
stack.size();
stack.isEmpty();
Queue<Integer> Q = new LinkedList<>();
Q.offer(object);
Q.poll();
Q.peek();
Q.size();
Q.contains(object);
return this - o
return o - this
// 이분검색 로직
public static int binarySearch(int target, int[] arr){
int lt = 0;
int rt = arr.length-1;
while(lt <= rt){
int mid = (lt + rt) / 2;
if(arr[mid] == target)
return mid+1;
else if(target < arr[mid])
rt = mid - 1;
else
lt = mid + 1;
}
return 0;
}
public class Main {
public static void main(String[] args) {
int n = 45;
fibo = new int[n+1];
fibonacci(n);
for(int i=1; i<=n; ++i)
System.out.println(fibo[i]+" ");
}
static int[] fibo;
public static int fibonacci(int n){
if(fibo[n] > 0)
return fibo[n];
if(n==1)
return fibo[n] = 1;
else if(n==2)
return fibo[n] = 1;
else
return fibo[n] = fibonacci(n-1)+fibonacci(n-2);
}
}
nCr = n-1Cr-1 + n-1Cr
로 계산할수도 있는데 이 공식 역시 피보나치 수열과 비슷한 방식으로 풀이가 가능하기 때문에, 메모이제이션을 활용할 수 있다.graph[a][b] = 1;
graph[b][a] = 1;
graph[a][b] = 1;
graph[a][b] = c;
graph = new ArrayList<ArrayList<T>>;
// x 노드와 연결된 정점을 탐색할때
for(int nx : graph.get(x)){
...
}
PriorityQueue<Edge> pQ = new PriorityQueue<>();
PriorityQueue<Edge> pQ = new PriorityQueue<>(Collections.reverseOrder());
/* find 메소드 */
public static int Find(int v){
if(v == unf[v])
return v;
else
return unf[v] = Find(unf[v]); // 메모이제이션
}
/* union 메소드 */
public static void Union(int a, int b){
int fa = Find(a);
int fb = Find(b);
if(fa!=fb)
unf[fa] = fb;
}
혹시 참고해서 저도 블로그에 정리를 해도 괜찮을까요 ?