코테 정리

Posted on January 8th, 2024

Java 코테 틀

import java.util.*; 를 쓰고 시작

class solution {

	 public int solution() {
      isPrime(10);
      return 0;
   }

   private boolean isPrime(int number) {
       return true;
   }

   static class A {
      private final int a;
      
      public A(int a) {
          this.a = a;
      }
   }
}

HashMap - 각 key 에 대한 value 를 추적할 때

Hash<String, Integer> hm = new HashMap<>();
hm.put("a", 3);
hm.getOrDefault("a", 0) 
hm.keySet();
hm.values(); 

보통 HashMap 같은 경우에는 그 key 에 대한 값들을 추적하면서 결과적으로 hm.keySet() 을 통해서 key 값들을 추출한다음에 get() 을 통해서 그 value 들을 가져와서 결과를 낸다.

for (String str : hm.keySet()) {
    hm.get(key);
}

hm.put("a", hm.getOrDefault("a",0) + 1);

HashSet - 중복을 없애고 싶을 때

HashSet<Integer> hs = new HashSet<>();
Set<Integer> hs = new HashSet<>();
hs.add();
hs.size();
hs.contains(3);
hs.remove();
if ( reserveSet.contains(a) ) reserveSet.remove(a)
else lostSet.add(a)

String - 문자열

String str;
str.substring(0, i);
str.length();
char[] strChars = str.toCharArray();
char c = str.charAt(i);
charAt(index)
Arrays.sort(phone_book);
str.startsWith(str1);
c == 'a';
char c = 'a';
rny_string.replaceAll("m", "rn");

numStr.**chars()**.map(c -> c - 48).sum(); 
문자열 "abc"에 대해 chars() 메소드를 호출하면,
각 문자 'a', 'b', 'c'ASCII 코드 값인 97, 98, 99를 요소로 하는 IntStream이 생성

answer += (int)num_str.charAt(i) - 48;
String[] numArr= num_str.split("")

myString = myString.toLowerCase();
myString = myString.toUppercase();
myString.contains(pat); // 포함되는지 확인

String.valueOf(number) <- intString 으로

char currentChar = my_string.charAt(i);
if (String.valueOf(currentChar).equals(alp)) {
         sb.append(Character.toUpperCase(currentChar));
} else {
         sb.append(currentChar);
}

String str = "ab sfd";
String result = str.replace(" ", "");

Arrays.sort 를 통해서 문자열도 정렬을 할 수가 있다. “a”, “b”

StringBuilder

StringBuilder sb = new StringBuilder();
sb.append(num); -> num 이 "" 문자열이여야함
sb.toString();

Array - 배열

ArrayList<Integer> list = new ArrayList<>();
List<Integer> list = new ArrayList<>();
list.add();

int[] arr = new int[list.size()];
int[] people = new int[n];

Arrays.sort(phone_book);
Arrays.copyOfRange(배열, 인덱스 첫시작, 잘리기전);
Arrays.sort(phone_book, (a,b) -> (b+a).compareTo(a+b)); 
int[] supoja1 = {1,2,3}; 이렇게 반복적으로 간다면
answer[i] == supoja1[i % supoja1.length]; 이렇게 패턴을 이용해서 사용 가능
배열에 인덱스를 사람의 번호라고 하고 그 인덱스의 값이 상태값임 people[0] = 1 인덱스 0번에 체육복 존재

만약, 체육복이 있고 최대 2, 최소 0개를 가지고있다고 한다면 표현을 할 때,
people[i] = 0, 1, 2 이렇게 표현 가능하다.

int[] arr;
int sum = Arrays.stream(arr).sum()

Arrays.sort(num_list);
int end = array.length - 1;
while (start < end) {
       int temp = array[start];
       array[start] = array[end];
       array[end] = temp;
       start++;
       end--;
}

Integer, Double 등

Integer.parseInt("010") : StringIntegerString.valueOf(number) <- intString 으로
String answer = Integer.toString(n); <- intString 으로
Integer.parseInt(""+a+b) : a = 10, b = 20 일때, 1020 처럼 합칠때
int leftInt = Integer.valueOf(leftStr);

String.valueOf 도 되고 Integer.valueOf 도 됨.

Integer.valueOf("010")
Integer.parseInt("010") 둘다 같은 값을 냄
import java.util.*;
import java.util.stream.*;

class Solution {
    public int solution(int[] num_list) {
        int sumResult = Arrays.stream(num_list).sum();
        int mulResult = Arrays.stream(num_list).reduce(1, (a, b) -> a * b);

        // 모든 원소들의 합의 제곱과 모든 원소들의 곱을 비교
        return mulResult < Math.pow(sumResult, 2) ? 1 : 0;
    }
}

IntStream.of(num_list).sum();
Arrays.stream(num_list).sum()

배수

number % n == 0 && number % m == 0 ? 1 : 0  number 가 **n, m 의 배수 일 때**

Stack - 스택

Stack<Integer> stack = new Stack<>();
stack.size();
stack.peek();
stack.push(num);
stack.pop();
stack.isEmpty();

peek(): 반환만함, 제거되지않음. 
pop() : 반환되고 제거도됨.
Stack<Character> stack = new Stack<>();

Math - 소수점이나 최대, 최소 등

Math.ceil();
Math.max(a,b);
Math.min(a,b);
int days = (int) Math.ceil((100.0 - progresses[i]) / speeds[i]);int days = (100 - progresses[i]) / speeds[i];
if ((100 - progresses[i]) % speeds[i] != 0) {
     days++;
}

Queue - 제일 먼저 들어오고 제일 먼저 나가라 ex ) BFS

Queue<Integer> q = new LinkedList<>();

q.add();
q.clear();
q.isEmpty();
q.size();
q.peek();   // stack과 마찬가지로 반환만함. 제거되지않음

q.poll();   // 반환 제거
q.remove(); // 반환 제거

Heap - 가장 큰 최댓값, 작은 최솟값 O(logn)

PriorityQueue<Integer> minHeap = new PriorityQueue<>();
PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());

heap.add();
heap.offer();
heap.peek(); // 반환만
heap.poll();  // 제거 및 반환
PriorityQueue<Work> startQueue = new PriorityQueue<>((o1, o2) -> o1.start - o2.start);
PriorityQueue<Work> timeQueue = new PriorityQueue<>((o1, o2) -> o1.time - o2.time);
-> 오름차순 ( default )

public static class Work {
    private final int start;
    private final int time;

    public Work(int start, int time){
        this.start = start;
        this.time = time;
    }
}

PriorityQueue 같은 경우에는 class 객체를 넣어서 해결하는 문제가 있다. 가령, 그 객체의 필드값을 이용하여 정렬을 하는 경우가 있다. 위의 예시를 보자.

2차 배열

int[][] commands;
int[] answer = new int[commands.length];
int[] array = new int[commands.length];
int[] temp = Arrays.copyOfRange(array, commands[i][0] - 1, commands[i][1]);

Stream

list.stream().mapToInt(i -> i).toArray();

순열

private void permutation(String prefix, String str, Set<Integer> set) {
    int n = str.length();
    if (!prefix.equals("")) {
        set.add(Integer.parseInt(prefix));
    }
    for (int i = 0; i < n; i++) {
        permutation(prefix + str.charAt(i), str.substring(0, i) + str.substring(i + 1, n), set);
    }
}

소수

private boolean isPrime(int number) {
    if (number < 2) return false;
    for (int i = 2; i <= Math.sqrt(number); i++) {
        if (number % i == 0) {
            return false;
        }
    }
    return true;
}

DFS - 재귀 깊이 간다

private int dfs(int[] numbers, int index, int sum, int target) {
     if (index == numbers.length) {
         if (sum == target) {
             return 1;
         }
         return 0;
     }

     int count = dfs(numbers, index + 1, sum + numbers[index], target);
     count += dfs(numbers, index + 1, sum - numbers[index], target);

     return count;
}

private void dfs(int[][] computers, boolean[] visited, int start) {
     visited[start] = true;

     for (int i = 0; i < computers.length; i++) {
         if (computers[start][i] == 1 && !visited[i]) {
              dfs(computers, visited, i);
         }
     }
}
    1

BFS - 하나의 기준점에 가까운것 부터 보자

private void bfs(int[][] computers, boolean[] visited, int start) {
       Queue<Integer> queue = new LinkedList<>();
       queue.offer(start);
       visited[start] = true;

       while (!queue.isEmpty()) {
            int computer = queue.poll();

            for (int i = 0; i < computers.length; i++) {
               if (computers[computer][i] == 1 && !visited[i]) {
                   queue.offer(i);
                   visited[i] = true;
               }
           }
       }
   }

이분 탐색

public long solution(int n, int[] times) {
    long answer = Long.MAX_VALUE;
    long minTime = 1;
    long maxTime = (long) n * getMax(times);

    while (minTime <= maxTime) {
        long midTime = (minTime + maxTime) / 2;
        long peopleProcessed = getPeopleProcessed(times, midTime);

        if (peopleProcessed < n) {
            minTime = midTime + 1;
        } else {
            answer = Math.min(answer, midTime);
            maxTime = midTime - 1;
        }
    }

    return answer;
}

해커랭크

1Week

1번 문제

System.out.format("%.6f%n", (double) positiveCount / size);

여기서 알아야할 것
System.out.format
%.6f -> 6자리 소수점까지 표현해야하는 부분인거고 double 인 경우, f 로 표현한다.
positiveCount 가 int

2번 문제

실수 할 수 있는 부분
int[] arr -> Arrays.sort(arr) 가능 하지만,
List<Integer> 같은 경우에는 Arrays.sort가 불가능하다.

이런 경우,
List<Integer> arr
Collections.sort(arr);

출력할때, 실수한 부분
int a = 1;
int b = 2;
System.out.println(a + " " + b);

3번 문제

String[] timeParts = s.substring(0, 8).split(":");
String hours = timeParts[0];

string -> s.endsWith, s.startsWith

2Week

1번 문제

할거 없음 

2번 문제

System.out.println(); 에서 한국어 쓰면 ASCII 문제있다고 잘안됨

1 2 3
4 5 6
9 8 9 

대각선
반대 대각선

public static int diagonalDifference(List<List<Integer>> arr) {
    int n = arr.size();
    int leftToRight = 0;
    int rightToLeft = 0;
        
    for (int i = 0; i < n; i++) {
        leftToRight += arr.get(i).get(i);
        rightToLeft += arr.get(i).get(n - 1 - i);
    }
        
    return Math.abs(leftToRight - rightToLeft);
}

3번 문제

The frequency array 
- 빈도 수