๐ง 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 ๋ฑ ๊ฐ๋ฅ.