π§ Algorithm Study
LinkedHash Mapμ HashMapμ μμ, κΈ°λ³Έ κΈ°λ₯μ κ°μΌλ μμλ₯Ό κ°μ§κ³ μλ€.
- putμ ν λ νΈμΆ.
- κ°μ₯ μ΅κ·Όμ λ€μ΄μ¨ λ°μ΄ν°λ€μ μΌμ κ°μλ‘ μ μ§νκ³ μ ν λ μ¬μ© κ°λ₯.
- eldestλ‘ κ°μ₯ μ€λλ μνΈλ¦¬λ₯Ό μκ³ μλ€.
protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
return false;
}####- μ¬μ μ
protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
return size() > 3;
}μ¬μ΄μ¦κ° 3λ³΄λ€ μ»€μ§λ©΄ κ°μ₯ μ€λλ κ°μ μ§μ°κ³ , κ·Έ μ리λ₯Ό λ°©κΈ λ€μ΄μ¨ μνΈλ¦¬λ‘ λ체νλ€.
String pattern = "^[A-Z]*$";
boolean regex = Pattern.matches(pattern, elm);
if(regex){
return true;
}
return false;- λλ²μ§Έ μΈμμ λ¬Έμμ΄μ΄ ν¨ν΄κ³Ό μΌμΉνλ©΄ true λ°ν.
answer = scores.stream().mapToInt(score -> score).sum();
scores.stream().reduce(0,Integer::sum);- λ λΌμΈ λͺ¨λ Stream λ΄μ μμλ€μ intκ°μΌλ‘ λνκΈ° μν μ½λμ΄λ€.
- νμ§λ§ μλλ₯Ό μΈ‘μ ν΄λ³΄λ©΄ mapToIntκ° λ μ’μ μ±λ₯μ 보μ¬μ€λ€
- π€ reduceμ κ²½μ°μλ λ°μ±, μΈλ°μ±μ κ³Όμ μ κ±°μΉκΈ° λλ¬Έμ μλκ° λ λ리λ€.
List<Map.Entry<Integer, Integer>> orderByValue = elmCount.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.collect(Collectors.toList());- comparingByValue | comparingByKeyλ₯Ό μ¬μ©νMapμ μ λ ¬ν μ μλ€.
- κΈ°λ³Έμ μΌλ‘ μ€λ¦μ°¨μ, λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬νκ³ μΆλ€λ©΄ μλμ κ°μ΄ ν μ μλ€.
.sorted(reverseOrder(Map.Entry.comparingByValue))if(elmCount.containsKey(elmValue)){
elmCount.put(elmValue, elmCount.get(elmValue) +1);
}
else{
elmCount.put(elmValue, 1);
} map.put(n, map.getOrDefault(n, 0) + 1);- μμ μ½λλ₯Ό getOrDefaultλ₯Ό μ¬μ©νμ¬ μλ μ½λλ‘ λ³κ²½ν μ μλ€
String road = "00010101101"
StringBuffer stringBuffer = new StringBuffer(road);
StringBuffer newRoad = stringBuffer.replace(startIdx, endIndex, "1");- startIdxλΆν° endIdx -1 κΉμ§μ λ²μλ₯Ό 3λ²μ§Έ μΈμμ λ¬Έμμ΄λ‘ μΉννλ€.
public int pick(String road,List<Integer> zeroIndex, int n){
if(zeroIndex.size() == 0){
return getRoadLength(road);
}
int maxLength = 0;
StringBuffer stringBuffer;
List<Integer> myZeroIndex = new ArrayList<>();
// idex List 볡μ¬
myZeroIndex.addAll(zeroIndex);
for(int i=0; i<myZeroIndex.size(); i++){
myZeroIndex.clear();
myZeroIndex.addAll(zeroIndex);
stringBuffer = new StringBuffer(road);
int idx = myZeroIndex.remove(i);
int length = 0;
// λλ‘ ν κ³³ 보μ
StringBuffer newRoad = stringBuffer.replace(idx, idx+1, "1");
// μ¬κ·λ‘ 보μλ λλ‘ λ°μμ€κΈ°
if(n > 1){
length = pick(newRoad.toString(), myZeroIndex, n-1);
}
// λ§μ§λ§ μ¬κ·νΈμΆ
else{
length = getRoadLength(newRoad.toString());
}
if(length > maxLength){
maxLength = length;
}
}
return maxLength;
}
- nκ°μ μ νμ§μμ mκ°λ₯Ό κ³ λ₯Ό λ κ°μ₯ μ΅μ μ μ νμ΄ λλλ‘ νλ μκ³ λ¦¬μ¦.
- λ©μλ μμλ n-1κ°μ μ νμ§λ‘ λ€μ μ¬κ·νΈμΆ.
- μ¬κ·νΈμΆμμλ μμ μκ² μ£Όμ΄μ§ μ νμ§λ₯Ό λͺ¨λ νμ. μ΅μ μ κ°μ λ°ν.
- μ¦ μμ μ΄ 1κ°λ₯Ό κ³ λ₯΄κ³ , λλ¨Έμ§ μ νμ§λ₯Ό μ¬κ·νΈμΆλ‘ λ겨μ€λ€. κ° μ¬κ·νΈμΆ λ©μλμμλ λ κ·Έμ€ νλλ₯Ό μ ννκ³ μ¬κ·νΈμΆ. mκ°λ₯Ό μ ν ν νμ κ° κ³μ°.
Collectionμ forλ¬ΈμΌλ‘ νμνλ€κ° ν΄λΉ μΈλ±μ€ , λλ Objectλ‘ μμλ₯Ό add/remove νλ €κ³ νλ©΄, λ€λ₯Έ μμλ€μ μΈλ±μ€μ λ³νκ° μκΈ°κΈ° λλ¬Έμ μμΈκ° λ°μνλ€.
- remove
for(Iterator<String> it = dir.iterator(); it.hasNext();){
if(it.next().startsWith(split[1])){
it.remove();
}
}-
Iteratorλ₯Ό μ¬μ©νκ³ , removeν λμλ iterator μ체λ₯Ό removeν΄μ μ κ±°ν΄μ€λ€.
-
add
- λ€λ₯Έ 리μ€νΈμ λ£μ΄ λμλ€κ° μνκ° λλ ν addAll
λ°°μ΄μ μ€λ¦μ°¨μ, λ΄λ¦Όμ°¨μ μ λ ¬.
- μ€λ¦μ°¨μ μ λ ¬
Arrays.sort(arr);- λ΄λ¦Όμ°¨μ μ λ ¬
Arrays.sort(arr,Collections.reverseOrder())- 컀μ€ν μ λ ¬
Arrays.sort(arr, new Comparator<..>{...})π Comparatorμ μ¬μ©ν λλ IllegalArgumentExceptionμ΄ λ°μνμ§ μλλ‘ νμ -1,0,1μ λ°νν μ μλλ‘ κ΅¬ννλ€
return o1 - o2 or 쑰건문μ μ¬μ©νμ¬ -1,0,1μ λͺ¨λ λ°νν μ μλλ‘ κ΅¬ν.π€ sortν¨μμμλ Comparatorμ κ²μ¦μ μ κ·Ήμ μΌλ‘ νμ§λ μμ§λ§ μ λ ₯ λ°μ΄ν°μ λ°λΌ μ€ν λμ€ μλͺ»λμλ€λ μ¦κ±°λ₯Ό λ°κ²¬νκ² λλ©΄ λ°νμ μμΈλ₯Ό λ°μμν¨λ€.
PriorityQueue<Integer> que = new PriorityQueue<>(new Comparator<Integer>() {
@Override
public int compare(Integer integer, Integer t1) {
return 0;
}
});-
pick() -> κ°μ₯ μμ μμλ₯Ό νμΈ. μλ€λ©΄ null
-
poll() -> κ°μ₯ μμ μμλ₯Ό κΊΌλ΄μ¨λ€.(remove) μλ€λ©΄ null
-
remove() -> 맨 μμ μμ μ κ±°. boolean λ°ν.
-
clear() -> νλ₯Ό λΉμ΄λ€.
@Override
public int compareTo(Stage target) {
// μ€ν¨μ¨μ΄ κ°λ€λ©΄ μ€ν
μ΄μ§λ₯Ό κΈ°μ€μΌλ‘ μ€λ¦μ°¨μ.
if(this.failure == target.failure) return this.stage - target.stage;
// μ€ν¨μ¨ κΈ°μ€ λ΄λ¦Όμ°¨μ
else{
if(this.failure > target.failure) return -1;
else return 1;
}
}- thisκ° μ΄λ²μ μΆκ°νλ λ°μ΄ν°κ° λκ³ , λ°νκ°μ΄ μμλ©΄ ν΄λΉ λ°μ΄ν°λ₯Ό μμ, μμμ΄κ±°λ 0μ΄λ©΄ λ€μ λκ² λλ€.
π μ£Όμν΄μΌν μ .
- μ°μ μμ νλ heap μλ£κ΅¬μ‘°λ₯Ό μ΄μ©νκ³ , poll λ©μλλ₯Ό μ΄μ©νμ¬ κΊΌλΌ λ root λ Έλμ λ°μ΄ν°κ° κΊΌλ΄μ§κ³ , λ°μ΄ν°λ₯Ό μ¬μ λ ¬νκ² λλ€.
- λλ¬Έμ poll λ©μλκ° μλ Iteratorλ₯Ό μ΄μ©νμ¬ λ°μ΄ν°λ₯Ό μννκ² λλ©΄ μ€λ¦μ°¨μ, λ΄λ¦Όμ°¨μμΌλ‘ μ λ ¬λ κ°μ μ»μμ 보μ₯ν μ μλ€. max heap λλ min heapμ λΆλͺ¨ λ Έλκ° μμ λ³΄λ€ ν¬κ±°λ, μμκ² λ§μ 보μ₯νκΈ° λλ¬Έμ΄λ€.
- λ°μ΄ν°μ μΌλΆλ§μ κ°μ§κ³ μ°μ μμλ₯Ό μ νκ³ , μΌλΆ λ°μ΄ν°λ‘ μ°μ μμλ₯Ό μ ν μ μμ κ²½μ° λ€μ΄μ¨ μμλλ‘ λκ°μ 보μ₯νμ§ λͺ»νλ€.(λ§μ°¬κ°μ§λ‘ heapμ΄κΈ° λλ¬Έ)
- sequence λ³μλ₯Ό νλ μ μΈν΄λκ³ λ€μ΄μ¨ μμλ₯Ό λΉκ΅νλλ‘ κ΅¬νν΄μΌνλ€.
char[] chars = numString.toCharArray();
Arrays.sort(chars);
StringBuilder sb = new StringBuilder(new String(chars)).reverse();
System.out.println(sb.toString());- λ¨Όμ Stringμ charArrayλ‘ λ§λ€μ΄ μ€ ν Arrays.sort()λ₯Ό μ΄μ©νμ¬ μ€λ¦μ°¨μ μ λ ¬.
- charArrayλ₯Ό λ€μ new String(char[])λ‘ StringμΌλ‘ λ§λ€μ΄μ€λ€.
- StringBuilder.reverseλ‘ μμμΌλ‘ μ λ ¬.
Collections.reverseOrder()λ₯Ό μ¬μ©νκΈ° μν΄ Charactor λ°°μ΄μ μμ±νκ³ , charAtμΌλ‘ λ°°μ΄μ μ±μ°λ λ°©λ²λ κ°λ₯νλ€.
while(start <= end){
mid = (start + end) / 2;
if(uniqueCoors.get(mid) == c){
index = mid;
break;
}
else if(uniqueCoors.get(mid) > c){
end = mid -1;
}
else{
start = mid +1;
}
}- κΈ°λ³Έμ μΈ μ΄λΆνμ μκ³ λ¦¬μ¦.
private static int getLowerBound(List<Integer> arr, int target) {
int left = 0;
int right = arr.length -1;
int mid = 0;
while(left<=right){
mid = (left + right) / 2;
// targetμ΄ μλλκΉμ§ rightμ μ‘°μ. -> targetμ΄ μλ κ°μ₯ 첫 μΈλ±μ€.
if(target > arr[mid]) left = mid +1;
else right = mid -1;
}
return right;
}
private static int getUpperBound(List<Integer> arr, int target) {
int left = 0;
int right = arr.length -1;
int mid = 0;
while(left<=right){
mid = (left + right) / 2;
if(target >= arr[mid]) left = mid +1;
else right = mid -1;
}
return left;
}Arrays.binarySearch(arr, findValue);- κ°μ΄ μ‘΄μ¬νλ©΄ indexλ₯Ό λ°ν.
- μ‘΄μ¬νμ§ μμΌλ©΄ ν΄λΉ λ°°μ΄μ λ€μ΄κ°λ€λ©΄ λ€μ΄κ°κ² λλ indexμ μμ -1μ λ°ννλ€
ex) {1,3,4,5} -> 2λ₯Ό μ°Ύλλ€λ©΄ -2 λ°ν.
- λΆλͺ¨ 리μ€νΈλ₯Ό μ°Έμ‘°νλ subListλ₯Ό μμ±νλ€.
- μ°Έμ‘°μμ μ μ.
List<String> sub = new ArrayList<>(parent.subList(start, end));- μ μ²λΌ μ¬μ©νλ©΄ μ°Έμ‘°κ° μλκ³ λ¦¬μ€νΈμ μΌλΆλ₯Ό 볡μ¬ν 리μ€νΈκ° μμ±λλ€.
String[] answer = menuList.toArray(new String[menuList.size()]);int[] intArr = IntegerList.stream().mapToInt(i->i).toArray();- Wrapper ν΄λμ€μμ μμλ°μ΄ν° λ°°μ΄λ‘μ λ³νμ mapToInt, mapToDouble λ±μ μ¬μ©νμ¬ λ¨Όμ μΈλ°μ±.
List<T> list = Arrays.asList(arr);- μλ‘μ΄ Listλ₯Ό λ°ννλ κ²μ΄ μλ. ν΄λΉ λ°°μ΄μ λν List Viewλ₯Ό λ°ννλ€.
- λ³νλ listμ κ°μ μΆκ°νλ κ²μ΄ λΆκ°λ₯(μμΈ λ°μ). μλμ λ°°μ΄μ κ°μ λ³κ²½νλ©΄ ν¨κ» λ³κ²½λλ€.
List<T> list = new ArrayList<>(Arrays.asList(arr));- μμ λ¬λ¦¬ μλ‘μ΄ ArrayList κ°μ²΄λ₯Ό μμ±νλ€.
List<T> list = Stream.of(maxCount).collect(Collectors.toList());- Streamμ μ΄μ©ν λ³ν.
- Arrays.asList(int[]) -> List<int[]>
Arrays.stream(arr).boxed().collect(Collectors.toList());- streamμμ΄μ©νμ¬ Wrapper νμ μΌλ‘ λ³ν ν 리μ€νΈλ‘.
- κΈ°λ³Έν μ΄μμ μλ₯Ό λ€λ£° λ μ¬μ©νλ€.
BigInteger number = new BigInteger(num);
number.add(BigInteger val);
number.subtract(BigInteger val);
number.multiply(BigInteger val);
number.divide(BigInteger val);
number.remainder(BigInteger val);
// κΈ°λ³ΈνμΌλ‘ λ°ν
number.intValue()
...
// κΈ°λ³Έν λ°ν, νμ
μ λ²μλ₯Ό λ²μ΄λλ©΄ μμΈ λ°μ.
number.intValueExact()-
BigDecimal λν λμΌνκ² μ¬μ©νλ€.
-
StringμΌλ‘ λ³ν ν μ«μλ₯Ό λν΄ μΆλ ₯νλ κ²λ³΄λ€ μλκ° λ리λ€.
- ν μμ±.
Queue<Integer> queue = new LinkedList<>();- 첫 λ Έλ νμ.
queue.add(0);
visited[0] = true;- λ Έλ νμ.
while(!queue.isEmpty()){
// queueμμ μ΄λ² μμ λ
Έλλ₯Ό κ°μ Έμ΄.
int node = queue.poll();
// ν΄λΉ λ
Έλκ° μ‘°κ±΄μ λΆν©νλμ§ κ²μ¬.
if(쑰건 κ²μ¬){...}
// νμ¬ λ
Έλμ λ°©λ¬Ένμ§ μμ μμ λ
Έλλ€μ queueμ μΆκ°.
for(μμ λ
Έλ i){
if(!visited[i]){
queue.add(i);
visited[i] = true;
}
}
}- 1μ°¨μ λ°°μ΄μ κ²½μ°
boolean copy = originArr.clone();
boolean copy = System.arraycopy(origin,0, copy, 0, origin.length);- 2μ°¨μ λ°°μ΄
- μμ²λΌ λ¨μν cloneμ νκ² λλ€λ©΄ origin[i][j]μμ jλ₯Ό κ°λ₯΄ν€λ origin[i] λΆλΆλ§ κΉμ 볡μ¬κ° λκ³ μ€μ κ°μ κΉμ 볡μ¬κ° λμ§ μλλ€.
boolean copy = new boolean[n][n];
// 1λ² λ°©λ²
for(int i=0; i<n; i++){
copy[i] = originArr[i].clone();
}
// 2λ² λ°©λ²
for(int i=0; i<n; i++){
System.arraycopy(origin[i],0, copy[i], 0, origin[i].length);
}int[][] arr = new int[n][n];
Arrays.sort(line, Comparator.comparingInt(c -> c[0]));- arr[n][0] κ°μ κ°μ§κ³ μ€λ¦μ°¨μ μ λ ¬.
- a >=b μ΄κ³ , r = a % b μΌλ GCD(a,b) == GCD(b,r)
- ex) GCD(259,63) == GCD(63,7) == GCD(7, 0) -> μ΅λ곡μ½μλ 7μ΄λ€.
- π μ€μ λ‘ κ΅¬νν λλ a μ bμ€ μ΄λκ²μ΄ ν°μ§ μ κ²½μ°μ§ μμλ λλ€, aκ° bλ³΄λ€ μλλΌλ λ€μ λ°λ³΅μ b,aλ‘ λ€μ§μ΄μ Έ λ€μ΄κ°κΈ° λλ¬Έ. (GCD(16, 24) -> r= 16, b = 24κ° λ¨, λ€μ GCD(24,16)
- a,b κ·Έλ¦¬κ³ aμ bμ μ΅λ곡μ½μλ₯Ό l μ΄λΌκ³ ν λ, a=Al, b=Bl μ΄λ€.
- μ΅μ 곡배μλ A * B * l μ΄λ―λ‘ a * b / l μ΄λ€.
// λ°λ³΅λ¬Έ
int LCM = a * b;
int r = a % b;
while(r > 0){
a = b;
b = r;
r = a % b;
}
int GCD = b;
LCM /= GCD;
// μ¬κ·
private static int gcd(int a, int b) {
if(b <= 0) return a;
return gcd(b, a % b);
}- nCk = n! / k!(n-k)!
- nCk = n-1Ck-1 + n-1Ck
- ν©ν 리μΌμ 12λ₯Ό λμ΄κ°λ©΄ intλ₯Ό λ²μ΄λκ³ 20μ λμ΄κ°λ©΄ longμ λ²μ΄λλ€.
int[] arr = {1,2,3};
String s = Arrays.toString(arr);
// [1,2,3]
String[] arr2 = {"a","b","c"};
String s2 = String.join("", arr);
// abc
Arrays.stream(arr2).collect(Collectors.joining());
// abc
String.valueOf(charArr);
// abcμγ λ€λ‘ μμλ₯Ό μ μΆλ ₯ κ°λ₯, μ€ν, νλ‘ λͺ¨λ μ¬μ©ν μ μλ€.
Deque<T> deque = new ArrayDeque, LinkedList ..- addFirst, OfferFirst, push : λ±μ μμ μμ μ½μ , addλ μμΈλ₯Ό, offerλ booleanκ° λ°ν.
- addList, OfferLast, add : λ±μ λ€μ μμ μ½μ .
- addAll(Collection ) : collectionμ λͺ¨λ λ°μ΄ν°λ₯Ό λ±μ λ€μͺ½μ μ½μ .
- removeFirst, pollFirst, remove, poll, pop : μμͺ½μμ μ κ±° ν λ°ν, removeλ λ±μ΄ λΉμ΄μμΌλ©΄ μμΈλ₯Ό, pollμ nullμ 리ν΄.
- removeLast, pollLast : λ€μμ μ κ±°νκ³ λ°ν.
- removeFirstOccurrence(Obj o), remove(Obj o) : μμͺ½μμ λΆν° νμνλ©° oλ₯Ό μ°Ύμ μ κ±°.
- removeLastOccurrence(Obj o) : λ€μͺ½μμ λΆν° νμνλ©° oλ₯Ό μ°Ύμ μ κ±°.
- getFirst, PeekFirst, peek : λ±μ κ°μ₯ μ μμλ₯Ό λ°ν, λ±μ΄ λΉμ΄μμΌλ©΄ getμ μμΈλ₯Ό, peekλ nullμ λ°ν.
- getLast, peekLast : λ±μ κ°μ₯ λ· μμ λ°ν.
- contain(Obj o) : oκ° ν¬ν¨λμ΄ μλμ§ νμΈ.
- size
- iterator : λ±μ μμͺ½λΆν° μμ°¨μ μΌλ‘ μ€νλλ iterator
- descendingIterator : λ€μͺ½λΆν° μμ°¨μ μΌλ‘ μ€ν.
aλ μ μ, pλ μμμ΄κ³ , aκ° pλ‘ λλμ΄μ§μ§ μμ λ.
a^p == a (mod p)
-> a^p mod p == a mod p
-> a^(p-1) == mod p
-> a * a^(p-2) == mod p
μ¦ a mod p μ μμμ a^(p-2) mod p
- μ΄ν κ³μμμμ νλ₯΄λ§ μμ 리 μ΄μ©.
- (N!/ K!(N-K)!)) mod p == (N! * (K!(N-K)!)^-1) mod p
- νλ₯΄λ§μ μμ 리λ₯Ό μ μ©νλ©΄ => (N! * (K!(N-K)!))^(p-2)) mod p
- κ³±μ ννλ‘ λνλλ―λ‘ λͺ¨λλ¬μ λΆλ°°λ²μΉ κ°λ₯.
- μ΅μ’ μ μΌλ‘ ꡬν΄μΌ νλ κ°μ => ((N! mod p) * (K!(N-K)!)^(p-2) mod p) mod p
final static String[] convert = new String[]{
"0","1","2","3","4","5","6","7","8","9",
"A","B","C","D","E","F"
};
StringBuilder convNum = new StringBuilder();
while(num > 0){
convNum.append(convert[num % n]);
num /= n;
}
convNum.reverse();String result = Integer.toStirng(num, N);- Long.toString λ± κ°λ₯.