Skip to content

kimtaejun97/Algorithm

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

170 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ•Ή Algorithm

🧐 Algorithm Study


πŸ“Œ LinkedHashMap의 removeEldestEntry()


LinkedHash Map은 HashMap을 상속, κΈ°λ³Έ κΈ°λŠ₯은 κ°™μœΌλ‚˜ μˆœμ„œλ₯Ό κ°€μ§€κ³  μžˆλ‹€.

🧐 removeEldestEntry()

  • put을 ν•  λ•Œ 호좜.
  • κ°€μž₯ μ΅œκ·Όμ— λ“€μ–΄μ˜¨ 데이터듀을 일정 개수둜 μœ μ§€ν•˜κ³ μž ν•  λ•Œ μ‚¬μš© κ°€λŠ₯.
  • eldest둜 κ°€μž₯ 였래된 μ—”νŠΈλ¦¬λ₯Ό μ•Œκ³ μžˆλ‹€.

- κΈ°λ³Έ μ •μ˜

protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
    return false;
}

####- μž¬μ •μ˜

protected boolean removeEldestEntry(Map.Entry<K,V> eldest){
    return size() > 3;
}

μ‚¬μ΄μ¦ˆκ°€ 3보닀 컀지면 κ°€μž₯ 였래된 값을 μ§€μš°κ³ , κ·Έ 자리λ₯Ό 방금 λ“€μ–΄μ˜¨ μ—”νŠΈλ¦¬λ‘œ λŒ€μ²΄ν•œλ‹€.

πŸ“Œ Matches, Pattern


String pattern = "^[A-Z]*$";
boolean regex = Pattern.matches(pattern, elm);
        if(regex){
            return true;
        }

        return false;
  • λ‘λ²ˆμ§Έ 인자의 λ¬Έμžμ—΄μ΄ νŒ¨ν„΄κ³Ό μΌμΉ˜ν•˜λ©΄ true λ°˜ν™˜.

πŸ“Œ Stream, reduce와 mapToInt


answer = scores.stream().mapToInt(score -> score).sum();

scores.stream().reduce(0,Integer::sum);
  • 두 라인 λͺ¨λ‘ Stream λ‚΄μ˜ μš”μ†Œλ“€μ„ intκ°’μœΌλ‘œ λ”ν•˜κΈ° μœ„ν•œ μ½”λ“œμ΄λ‹€.
  • ν•˜μ§€λ§Œ 속도λ₯Ό 츑정해보면 mapToIntκ°€ 더 쒋은 μ„±λŠ₯을 보여쀀닀
  • πŸ€” reduce의 κ²½μš°μ—λŠ” λ°•μ‹±, μ–Έλ°•μ‹±μ˜ 과정을 거치기 λ•Œλ¬Έμ— 속도가 더 λŠλ¦¬λ‹€.

πŸ“Œ Map Sort와 getOrDefault


🧐 Map.Entry.comparingBy*

List<Map.Entry<Integer, Integer>> orderByValue = elmCount.entrySet().stream()
            .sorted(Map.Entry.comparingByValue())
            .collect(Collectors.toList());
  • comparingByValue | comparingByKeyλ₯Ό μ‚¬μš©ν•˜Map을 μ •λ ¬ν•  수 μžˆλ‹€.
  • 기본적으둜 μ˜€λ¦„μ°¨μˆœ, λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ν•˜κ³  μ‹Άλ‹€λ©΄ μ•„λž˜μ™€ 같이 ν•  수 μžˆλ‹€.
.sorted(reverseOrder(Map.Entry.comparingByValue))

🧐 getOrDefault

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λ₯Ό μ‚¬μš©ν•˜μ—¬ μ•„λž˜ μ½”λ“œλ‘œ λ³€κ²½ν•  수 μžˆλ‹€

πŸ“Œ StringBuffer : λ¬Έμžμ—΄μ˜ νŠΉμ •μœ„μΉ˜ μΉ˜ν™˜.


String road = "00010101101"
StringBuffer stringBuffer = new StringBuffer(road);
StringBuffer newRoad = stringBuffer.replace(startIdx, endIndex, "1");
  • startIdxλΆ€ν„° endIdx -1 κΉŒμ§€μ˜ λ²”μœ„λ₯Ό 3번째 인자의 λ¬Έμžμ—΄λ‘œ μΉ˜ν™˜ν•œλ‹€.

πŸ“Œ 완전탐색: nκ°œμ—μ„œ m개λ₯Ό 선택, μž¬κ·€μ‚¬μš©.


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개λ₯Ό 선택 ν•œ 후에 κ°’ 계산.

πŸ“Œ Iterator 을 μ΄μš©ν•œ ConcurrentModificationException ν•΄κ²°


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


λ°°μ—΄μ˜ μ˜€λ¦„μ°¨μˆœ, λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬.

  • μ˜€λ¦„μ°¨μˆœ μ •λ ¬
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)


 PriorityQueue<Integer> que = new PriorityQueue<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer integer, Integer t1) {
                return 0;
            }
        });
  • Comparator을 μƒλž΅ν•˜λ©΄ 기본적인 μ˜€λ¦„μ°¨μˆœ.

  • pick() -> κ°€μž₯ μ•žμ˜ μš”μ†Œλ₯Ό 확인. μ—†λ‹€λ©΄ null

  • poll() -> κ°€μž₯ μ•žμ˜ μš”μ†Œλ₯Ό κΊΌλ‚΄μ˜¨λ‹€.(remove) μ—†λ‹€λ©΄ null

  • remove() -> 맨 μ•žμ˜ μš”μ†Œ 제거. boolean λ°˜ν™˜.

  • clear() -> 큐λ₯Ό λΉ„μš΄λ‹€.

  • λ˜λŠ” ν΄λž˜μŠ€μ— Comparable의 compareTo λ§€μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•΄λ„ λœλ‹€.

@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 λ³€μˆ˜λ₯Ό ν•˜λ‚˜ 선언해두고 λ“€μ–΄μ˜¨ μˆœμ„œλ₯Ό λΉ„κ΅ν•˜λ„λ‘ κ΅¬ν˜„ν•΄μ•Όν•œλ‹€.

πŸ“Œ String λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬


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으둜 배열을 μ±„μš°λŠ” 방법도 κ°€λŠ₯ν•˜λ‹€.

πŸ“Œ 이뢄 탐색(Binary Search)


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;
    }
}
  • 기본적인 이뢄탐색 μ•Œκ³ λ¦¬μ¦˜.

☝️ LowerBound, UpperBound

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 λ°˜ν™˜.

πŸ“Œ List.subList(start, end)


  • λΆ€λͺ¨ 리슀트λ₯Ό μ°Έμ‘°ν•˜λŠ” subListλ₯Ό μƒμ„±ν•œλ‹€.
  • μ°Έμ‘°μž„μ— 유의.
List<String> sub = new ArrayList<>(parent.subList(start, end));
  • μœ„ 처럼 μ‚¬μš©ν•˜λ©΄ μ°Έμ‘°κ°€ μ•„λ‹ˆκ³  리슀트의 일뢀λ₯Ό λ³΅μ‚¬ν•œ λ¦¬μŠ€νŠΈκ°€ μƒμ„±λœλ‹€.

πŸ“Œ List <-> Array


List To Array

String[] answer = menuList.toArray(new String[menuList.size()]);
int[] intArr = IntegerList.stream().mapToInt(i->i).toArray();
  • Wrapper ν΄λž˜μŠ€μ—μ„œ μ›μ‹œλ°μ΄ν„° λ°°μ—΄λ‘œμ˜ λ³€ν™˜μ€ mapToInt, mapToDouble 등을 μ‚¬μš©ν•˜μ—¬ λ¨Όμ € μ–Έλ°•μ‹±.

Array To List

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을 μ΄μš©ν•œ λ³€ν™˜.

πŸ– κ·ΈλŸ¬λ‚˜ μœ„μ˜ 방법듀은 μ›μ‹œνƒ€μž…μ„ Wrapper 클래슀둜 λ³€ν™˜ν•΄μ£Όμ§€ μ•ŠλŠ”λ‹€

  • Arrays.asList(int[]) -> List<int[]>
Arrays.stream(arr).boxed().collect(Collectors.toList());
  • streamμ„μ΄μš©ν•˜μ—¬ Wrapper νƒ€μž…μœΌλ‘œ λ³€ν™˜ ν›„ 리슀트둜.

πŸ“Œ BigInteger, BigDecimal


  • κΈ°λ³Έν˜• μ΄μƒμ˜ 수λ₯Ό λ‹€λ£° λ•Œ μ‚¬μš©ν•œλ‹€.
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으둜 λ³€ν™˜ ν›„ 숫자λ₯Ό 더해 좜λ ₯ν•˜λŠ” 것보닀 속도가 λŠλ¦¬λ‹€.

πŸ“Œ BFS - queue


  1. 큐 생성.
Queue<Integer> queue = new LinkedList<>();
  1. 첫 λ…Έλ“œ 탐색.
queue.add(0);
visited[0] = true;
  1. λ…Έλ“œ 탐색.
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);
}

πŸ“Œ Comparator.comparingInt()


int[][] arr = new int[n][n];
Arrays.sort(line, Comparator.comparingInt(c -> c[0]));
  • arr[n][0] 값을 κ°€μ§€κ³  μ˜€λ¦„μ°¨μˆœ μ •λ ¬.

πŸ“Œ μ΅œλŒ€κ³΅μ•½μˆ˜(GCD)와 μ΅œμ†Œκ³΅λ°°μˆ˜ : μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•


☝️ μ΅œλŒ€ κ³΅μ•½μˆ˜

  • 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을 λ²—μ–΄λ‚œλ‹€.

πŸ“Œ Array To String


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

μ•žγ… λ’€λ‘œ μš”μ†Œλ₯Ό μž… 좜λ ₯ κ°€λŠ₯, μŠ€νƒ, 큐둜 λͺ¨λ‘ μ‚¬μš©ν•  수 μžˆλ‹€.

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

πŸ“Œ Nμ§„μˆ˜ λ³€ν™˜ν•˜κΈ°


1. N으둜 λ‚˜λˆˆλ’€ λ‚˜λ¨Έμ§€λ₯Ό λ’€μ§‘μ–΄ 읽기.

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();

2. Integer.toString(int n, int radix)

String result = Integer.toStirng(num, N);
  • Long.toString λ“± κ°€λŠ₯.

About

Algorithm Study

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages