쏟아지는 코테들 앞두고 답답해서 하는 Java 코딩테스트 문법 정리
String str = "abcde";
str.length() // str의 길이 반환
str.isEmpty() // str의 길이가 0이면 true, 아니면 false
str.charAt(2) // 인덱스로 문자 찾기, c 반환
str.indexOf("c") // 문자로 첫번째 인덱스 찾기, 2 반환
str.lastIndexOf("c") // 문자의 마지막 인덱스 찾기, 2 반환
str.substring(2, 4) // 2~3 위치의 문자열 "cd" 반환
str.substring(3) // 3부터 끝까지의 문자열 "de" 반환
str.replace('b', 'k') // b를 k로 변경 (akcde)
str.equals("abcde") // str과 abcde를 비교해서 같으면 true, 다르면 false
str.contains("bc") // str에 bc가 포함되어 있으면 true, 아니면 false
str.split(" ") // 띄어쓰기로 구분된 문자열 str을 분리해서 String[] 배열 반환
str.split("") // 띄어쓰기 없는 문자열 str을 한 문자씩 분리해서 String[] 배열 반환
str.trim() // str의 앞뒤 공백 제거, 문자열 사이 공백은 제거 X
str.compareTo("abcdd")
/*
str과 abcdd가 같으면 0
str이 abcdd보다 사전순으로 앞이면 -1
str이 abcdd보다 사전순으로 뒤면 1
str과 abcdd가 마지막 문자만 다르면 마지막 문자의 사전순 차이 반환 (여기선 1)
*/
Integer.parseInt("300") // 문자열을 숫자로 변환
Integer.toString(300) // 숫자를 문자열로 변환
StringBuilder sb = new StringBuilder();
String str = sb.toString(); // Strgin에 sb를 넣으려면 toString() 필요
sb.append("abc") // 문자열 추가
sb.append("abc").append("def") // 문자열 연결 (→ abcdef)
sb.insert(2, "kk") // 2 위치에 kk 삽입 (→ abkkcdef)
sb.delete(0, 2) // 0~1 위치의 문자열 삭제 (→ c)
sb.deleteCharAt(2) // 2 위치의 문자 삭제 (→ ac)
sb.setCharAt(0, 'h') // 0 위치의 문자를 h로 변경 (→ hbc)
sb.reverse() // 문자열 거꾸로 뒤집기 (→ cba)
sb.setLength(2) // 문자열 길이를 2로 줄임 (→ ab)
sb.setLength(4) // 문자열 길이를 4로 늘림 (→ 뒤가 공백으로 채워짐)
StringTokenizer st = new StringTokenizer(br.readLine()); // 개행문자로 문자열 나눔
st = new StringTokenizer(br.readLine(), " "); // 띄어쓰기로 문자열 나눔
st.countTokens() // 토큰의 개수 반환
st.nextToken() // 다음 토큰을 반환, 이전 토큰은 제거
st.hasMoreTokens() // 반환할 다음 토큰이 있으면 true 반환, 없으면 false 반환
String[] str = br.readLine().split("");
miro[i][j] = Integer.parseInt(str[j]);
for (int i = 0; i < N; i++) {
String[] str = br.readLine().split("");
for (int j = 0; j < M; j++) {
miro[i][j] = Integer.parseInt(str[j]);
}
}
for (int i = 0; i < N; i++) {
String[] str = br.readLine();
for (int j = 0; j < M; j++) {
miro[i][j] = str.charAt(j) - '0';
}
}
for(int i = 0; i < N; i++) {
String str = br.readLine();
for(int j = 0; j < M; j++) {
dna[j] = str.charAt(j);
}
}
배열과 배열리스트, 연결리스트의 삭제 과정 비교

// 사이즈와 값이 둘 다 없는 빈 배열
String[] arr = {};
arr = new String[3];
// 사이즈는 존재하지만 값이 없는 빈 배열
String[] arr = new String[3];
// 사이즈가 자동 지정된 값이 있는 배열
String[] arr = {"A", "b", "C"};
String[] arr = new String[3];
String[] arr1 = new String[3];
String[][] arr3 = new String [3][4];
String[][] arr4 = new String [3][4];
Arrays.toString(arr); // 배열 전체 출력
Arrays.deepToStirng(arr3) // 다차원 배열 전체 출력
Arrays.copyOf(arr, arr.length); //arr를 arr 전체 길이만큼 복사
Arrays.copyOfRange(arr, 1, 3); // arr를 인덱스 1부터 2까지 복사
Arrays.sort(arr); // 배열 오름차순 정렬
Arrays.sort(arr, Collections.reverseOrder()); // 배열 내림차순 정렬
Arrays.equals(arr, arr1); //배열 비교 반환(같으면 true, 아니면 false)
Arrays.deepEquals(arr3, arr4); // 다차원 배열 비교 반환
List<String> list = new ArrayList<>();
list.add("서울") // list의 가장 뒤에 서울 삽입
list.add(1, "대전") // 1 위치에 대전 삽입
list.addAll(list2) // list의 뒤에 list2의 모든 값 삽입
list.get(0) // 0 위치의 값 반환 (서울)
list.set(0, "대구") // 0 위치의 값을 대구로 변경
list.indexOf("대구") // 대구의 첫번째 인덱스 반환
list.lastIndexOf("대구") // 대구의 마지막 인덱스 반환
list.remove(0) // 0 위치의 값 삭제
list.remove("대구") // 첫번째 대구 삭제
list.removeAll(list2) // list에서 list2에 들어있는 모든 값을 삭제
list.retainAll(list2) // list에서 list2에 들어있는 값을 제외한 모든 값을 삭제
list.clear() // 전체 값 삭제
list.isEmpty() // 길이가 0이면 true, 아니면 false
list.size() // 길이
list.contains("서울") // 서울이 list에 있으면 true, 없으면 false
list.containsAll(list2) // list에 list2의 모든 값이 포함되어 있으면 true
list.removeIf(k -> k % 2 != 0) // 람다식으로 홀수를 list에서 모두 제거
// 문자열 배열 → List
String[] tmp = "abcde";
List<String> list = new ArrayList<>(Arrays.asList(tmp));
// List → 문자열 배열
List<String> list = new ArrayList<>();
String[] tmp = list.toArray(new String[list.size()]);
// 정수형 배열 → List
int[] tmp = {1111, 2222, 3333, 4444};
List<Integer> list = new ArrayList<>(Arrays.asList(tmp));
// List → 정수형 배열
List<Integer> list = new ArrayList<>();
int[] tmp = list.stream().mapToInt(i->i).toArray();
Stack 클래스: 스택 자료구조를 구현한 클래스Stack<Ingeger> stack = new Stack<>();
LinkedList는 doubly linked list이므로 스택으로도 사용 가능Deque<Integer> stack = new LinkedList<>();
ArrayDeque 역시 양쪽에서 삽입, 삭제가 가능하므로 스택으로 활용 가능Deque<Integer> stack = new ArrayDeque<>();
Stack<Ingeger> stack = new Stack<>();
Deque<Integer> stack = new ArrayDeque<>();
Deque<Integer> stack = new LinkedList<>();
stack.push(1) // 값 추가
stack.pop() // 마지막 값 삭제
stack.clear() // 값 전체삭제
stack.size() // 크기 반환
stack.isEmpty() // 비어있으면 true, 아니면 false
stack.contains(1) // 1을 포함하고 있으면 true, 아니면 false
stack.peek() // Stack top 출력 (제거 X), 비어있으면 null 반환
push 하려할 때, 기존 Stack의 top과 짝을 이루게 되면, push하려는 값과 기존 top을 같이 pop하는 방식push했던 값을 확인 가능push, 함수 종료는 pop 하는 것과 같은 형태LinkedList는 연결 리스트를 구현한 클래스로, 큐로 사용할 수 있습니다. 내부적으로 doubly linked list로 구현되어 있음Queue<Integer> queue = new LinkedList<>();
Queue<Integer> queue = new ArrayDeque<>();
일반적으로
ÀrrayDeque가 다른 클래스들에 비해 가장 빠름
=> 특별한 이유가 없다면 `ArrayDeque사용하기
Queue<Integer> queue = new ArrayDeque<>();
Queue<Integer> queue = new LinkedList<>();
queue.add(1) // 값 추가
queue.offer(2) // 값 추가
queue.poll() // 첫 번째 값 반환 후 제거, 비어있으면 null 반환
queue.remove() // 첫 번째 값 제거
queue.clear() // 값 모두 삭제
queue.peek() // 첫 번째 값 출력 (제거 X)
queue.isEmpty() // 큐가 비어있는지 확인
Deque<Integer> dq = new ArrayDeque<>();
Deque<int[]> dq = new ArrayDeque<int[]>(); // Deque 배열 선언 시
dq.offer(1) // 값 추가 (큐랑 같음)
dq.offerFirst(1) // 앞으로 추가 (큐랑 반대)
dq.offerLast(1) // 뒤로 추가
dq.offer(new int[]{5,4,1,....,}) // 배열 추가
dq.poll(1) // 첫 번째 값 반환 후 제거, 비어있으면 null 반환 (큐랑 같음)
dq.pollFirst(1) // 첫 번째 값 반환 후 제거, 비어있으면 null 반환 (큐랑 같음)
dq.pollLast // 마지막 값 반환 후 제거, 비어있으면 null 반환 (큐랑 반대)
dq.peek() // 마지막 값 출력 (제거 X), 비어있으면 null 반환 (스택과 같음)
dq.get() // peek()과 같음
// 이 외에 add, offer, push, pop 모두 first, last 사용 가능
// push만 first, last 사용 불가
PriorityQueue<Integer> pq = new PriorityQueue<>(큐의 초기용량, Comparator를 정의하는 람다식);
// 기본은 낮은 숫자가 우선순위를 갖는다.
// 높은 숫자가 우선되게 하려면 () 안에 Collections.reverseOrder() 작성
pq.add(1) // 값 추가
pq.offer(1) // 값 추가
pq.poll() // 첫 번째 값 반환 후 제거, 비어있으면 null 반환
pq.remove() // 첫 번째 값 제거
pq.clear() // 값 모두 삭제
pq.peek() // 첫 번째 값 출력 (제거 X)
public void test_student_age() {
int capacity = 4;
// Student 객체 Age의 가장 낮은 값이 먼저 추출되도록 설정
PriorityQueue<Student> studentAgeHeap = new PriorityQueue<>(capacity, Comparator.comparing((Student student) -> student.getAge()));
studentAgeHeap.add(new Student("Frank", 23));
studentAgeHeap.add(new Student("Angela", 10));
studentAgeHeap.add(new Student("David", 30));
studentAgeHeap.add(new Student("Joe", 15));
assertThat(studentAgeHeap.poll().getName()); // Angela 출력
assertThat(studentAgeHeap.poll().getName()); // Joe 출력
}
HashSet<Integer> set = new HashSet<>();
set.add(1) // 값 추가
set.remove(1) // 값이 1인 데이터 삭제
set.removeAll(set2) // set의 데이터 중 set2에 들어있는 데이터를 모두 삭제
set.retainAll(set2) // set의 데이터 중 set2에 들어있지 않은 데이터를 모두 삭제
set.clear() // 모든 데이터 삭제
set.size() // 크기 반환
set.contains(1) // 값 1이 있으면 true, 없으면 false
// 값 출력
// 방법 1: get 메소드가 없으므로 원소에 접근하려면 이터레이터 사용
Iterator iter = set.iterator();
while (iter.hasNext())
System.out.println(iter.next());
// 방법 2: for-each문으로 원소에 접근
for (String item: set)
System.out.println(item);
HashMap<Integer, String> map = new HashMap<Integer, String>();
HashMap<Integer, String> map = new HashMap<>(); // 타입 파라미터 생략 가능
map.put(1, "사과"); // Key 삽입
map.remove(1); // key값으로 value 삭제
map.clear(); // 전체 삭제
map.values(); // 저장된 모든 value 출력
map.get(1); // Key값으로 value 반환
map.containsKey(1); // Key 포함여부 반환(있으면 true, 없으면 false)
map.containsValue("사과"); // value 포함 여부 반환
map.isEmpty(); // HashMap 비어있는지 여부 반환
map.keySet(); // HashMap에 저장된 모든 Key 반환
map.size(); // HashMap에 저장된 요소의 개수 반환
// 출력
// 전체 출력
System.out.println(map); // {1=사과}
// 저장된 key 값 확인
for (Integer i : map.keySet()) {
System.out.println(map.get(i)); // 사과
}
// entrySet() 활용
for (Entry<Integer, String> entry: map.entrySet())
System.out.println(entry.getKey() + entry.getValue()); // 1 사과