여느때처럼 파이썬으로 주구장창 문제 풀다가
양심의 가책을 느낄 때쯤 자바로 쉬운 문제 하나씩 풀면서 죄책감을 씻어내고 있었는데..
또 Java로만 응시 가능한 코딩테스트가 나타나고 말았다..😇
항상 Python으로 코딩테스트를 준비해왔는데, 주로 Java 백엔드를 지원하다보니 코테에서 Java만 쓰도록 제한하는 기업이 적지 않게 있었다.
기억나는 곳은 NHN커머스, 엔씨소프트, 폴라리스오피스, 우테캠, 그외 몇몇 스타트업들
정도가 있었다.
엔씨소프트는 Python도 사용 가능했는데 지난 하반기엔 C++, Java만 지원했고, 11번가는 제한을 뒀었는데 지원언어를 늘린것 같다. 아무튼 몇몇 기업들은 항상 일정하진 않은 모양이다.
이참에 확실히 정리해놓고 써먹으려고 코테 하루 전에(엥?) 다급하게 문법과 메소드를 정리해본다..
라이브러리
1
2
| import java.util.*;
import java.io.*;
|
String
String은 문자 추가, 삭제 등 변경이 불가능한 타입
Operation | Example | Note |
---|
길이 | s.length() | |
빈 값 여부 | s.isEmpty() | 비었으면 true |
i번째 문자 | s.charAt(i) | |
문자 위치 (처음) | s.indexOf('c') | |
문자 위치 (마지막) | s.lastIndexOf('c') | |
서브스트링 (시작, 끝) | s.substring(srt, end) | srt ~ end-1 |
서브스트링 (시작) | s.substring(srt) | srt ~ 끝 |
문자 대체 | s.replace(s1, s2) | 문자열 s1을 s2로 치환 |
같은지 비교 | s.equals("abc") | 같으면 true |
값 비교 | s.compareTo("abc") | 같으면 0, s가 더 앞이면 -1, 뒤면 1 |
시작값 | s.startsWith("abc") | |
끝값 | s.endsWith("abc") | |
포함 여부 | s.contains("abc") | 포함하면 true |
쪼개기 (구분자) | s.split(" ") | 구분자로 분리 -> String[] 배열 반환 |
쪼개기 | s.split() | 한 문자씩 분리 -> String[] 배열 반환 |
앞뒤 공백 제거 | s.trim() | |
대문자로 변경 | s.toUpperCase() | |
소문자로 변경 | s.toLowerCase() | |
반복 | s.repeat(n) | s를 n번 반복한 문자열 반환 |
문자열 변환 | String.valueOf(obj) | obj가 null이면 “null” 반환 |
문자열 변환 | obj.toString() | obj가 null이면 NPE |
문자열 -> 숫자 변환 | Integer.parseInt("10") | |
숫자 -> 문자열 변환 | Integer.toString(300) | |
StringBuilder
StringBuilder는 변경 가능한 타입이므로 문자열을 변경해야 하는 문제에서 사용
1
| StringBuilder sb = new StringBuilder();
|
Operation | Example | Note |
---|
추가 | sb.append("abc") | |
삽입 | sb.insert(i, "abc") | |
삭제 | sb.delete(srt, end) | srt ~ end-1 문자열 삭제 |
i번째 삭제 | sb.deleteCharAt(i) | |
i번째 변경 | sb.setCharAt(i, 'x') | |
문자열 뒤집기 | sb.reverse() | |
길이 줄이기 | sb.setLength(3) | 길이를 3으로 줄임 |
길이 늘이기 | sb.setLength(10) | 길이를 10으로 늘임 (공백으로 채워짐) |
Array
1
2
| int[] arr = {1, 2, 3};
String[] arr = new String[n];
|
Operation | Example | Note |
---|
길이 | arr.length | |
출력 | Arrays.toString(arr) | |
정렬 (오름차순) | Arrays.sort(arr) | |
정렬 (내림차순) | Arrays.sort(arr, Collections.reverseOrder()) | |
일부 정렬 | Arrays.sort(arr, srt, end) | srt ~ end-1 만 정렬 |
이분탐색 | Arrays.binarySearch(arr, x) | |
값 채우기 | Arrays.fill(arr, value) | |
값 채우기 (시작, 끝) | Arrays.fill(arr, srt, end, value) | srt ~ end-1 만 채우기 |
복사 | Arrays.copyOf(arr, size) | 0번째 부터 size만큼 복사 |
복사 (시작지점 설정) | Arrays.copyOfRange(arr, srt, size) | srt부터 size만큼 복사 |
리스트로 변환 (고정) | Arrays.asList(arr) | 원본 배열 변경시 리스트 값도 변경, 리스트에 값 추가 불가 |
리스트로 변환 (가변) | new ArrayList<>(Arrays.asList(arr)) | 원본 배열과 동기화하지 않음, 리스트에 값 추가 가능 |
Collections
Operation | Example | Note |
---|
최대값 | Collections.max(list) | |
최소값 | Collections.min(list) | |
정렬 (오름차순) | Collections.sort(list) | |
정렬 (내림차순) | Collections.sort(list, Collections.reverseOrder()) | |
뒤집기 | Collections.reverse(list) | |
개수 | Collections.frequency(list, x) | |
이분탐색 | Collections.binarySearch(list, x) | 없으면 ‘-들어갈위치-1’을 반환 |
복사 | Collections.copy(from, to) | from의 모든 객체를 to에 복사해 반환 |
서로소 여부 | Collections.disjoint(c1, c2) | 전부 다르면 true |
List
1
| List<String> list = new ArrayList<>();
|
Operation | Example | Note |
---|
길이 | list.size() | |
빈 값 여부 | list.isEmpty() | |
추가 | list.add(x) | |
i번째에 추가 | list.add(i, x) | |
모든 객체 추가 | list.addAll(list2) | list의 뒤에 list2의 모든 값 삽입 |
i번째에 모든 객체 추가 | list.addAll(i, list2) | list의 i에 list2의 모든 값 삽입 |
i번째 값 | list.get(i) | |
i번째 변경 | list.set(i, x) | |
특정 값 위치 (처음) | list.indexOf(x) | 없으면 -1 |
특정 값 위치 (마지막) | list.lastIndexOf(x) | |
i번째 삭제 | list.remove(i) | |
특정 값 삭제 | list.remove(x) | |
특정 값들 삭제 (람다식) | list.removeIf(x -> x%2 == 0) | 람다식을 만족하는 값들 삭제 |
특정 값들 삭제 | list.removeAll(list2) | list 원소 중 list2에 있는 값들 삭제 |
특정 제외 값들 삭제 | list.retainAll(list2) | list 원소 중 list2에 없는 값들 삭제 |
전체 삭제 | list.clear() | |
슬라이싱 | list.subList(srt, end) | srt ~ end-1 부분리스트 반환 |
정렬 | list.sort() | 오름차순 |
포함 여부 | list.contains(x) | 있으면 true |
포함 여부 (여러개) | list.containsAll(list2) | list에 list2의 모든 값이 있으면 true |
배열로 변환 | list.toArray(new String[list.size()]) | |
Map
키-값 형식의 자료구조
- HashMap: 특정 규칙 없이 출력됨.
- LinkedHashMap: 키가 입력순으로 정렬되어 출력됨.
- TreeMap: 키가 알파벳순(오름차순)으로 정렬된 상태로 출력됨.
☑️ 주의
HashMap의 경우 데이터가 저장공간보다 더 추가되면 한 번에 약 2배로 늘리기 때문에 과부하가 많이 발생할 수 있으므로,
저장할 데이터의 개수를 알고 있다면 미리 용량을 설정하는 편이 좋음.
1
2
3
4
5
6
| Map<Integer, String> map = new HashMap<>();
// 키-값 접근
for (Entry<Integer, String> entry: map.entrySet()) {
System.out.println(entry.getKey() + entry.getValue());
}
|
Operation | Example | Note |
---|
추가 | map.put(k, v) | 해당 키가 이미 존재하면 값을 변경 |
조회 | map.get(k) | 해당 키가 없으면 null 반환 |
삭제 | map.remove(k) | 파라미터로 키를 전달 |
전체 삭제 | map.clear() | |
키 존재 여부 | map.containsKey(k) | |
값 존재 여부 | map.containsValue(v) | |
모든 키 | map.keySet() | |
모든 값 | map.values() | |
모든 키-값 | map.entrySet() | Entry 객체 Set을 반환 |
Set
중복을 허용하지 않는 자료구조
- HashSet : 순서x 정렬x
- LinkedHashSet : 삽입된 순서대로 순서를 관리. 순서o 정렬x
- TreeSet : 이진탐색트리 형태로 데이터를 저장. 순서x 정렬o
1
2
3
4
5
6
7
8
9
10
11
12
| Set<Integer> set = new HashSet<>();
// 원소 접근
// 방법 1. 이터레이터
Iterator iter = set.iterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}
// 방법 2. for-each
for (Integer item: set) {
System.out.println(item);
}
|
Operation | Example | Note |
---|
길이 | set.size() | |
추가 | set.add(x) | |
삭제 | set.remove(x) | |
포함 여부 | set.contains(x) | |
합집합 | set.addAll(c) | 주어진 컬렉션의 모든 객체를 추가 |
차집합 | set.removeAll(c) | 주어진 컬렉션의 객체와 같은 원소를 제거 |
부분집합 | set.containsAll(c) | 주어진 컬렉션의 모든 객체를 포함하는지 확인 |
교집합 | set.retainAll(c) | 주어진 컬렉션의 객체와 동일한 것만 남기고 삭제 |
전체 삭제 | set.clear() | |
Stack
1
| Stack<Ingeger> stack = new Stack<>();
|
Operation | Example | Note |
---|
길이 | stack.size() | |
추가 | stack.push(x) | |
삭제 | stack.pop() | |
Top 출력 | stack.peek() | 비어있으면 null 반환 |
전체 삭제 | stack.clear() | |
빈 값 여부 | stack.empty() | |
포함 여부 | stack.contains(x) | |
Queue
1
| Queue<Integer> q = new LinkedList<>();
|
Operation | Example | Note |
---|
길이 | q.size() | |
빈 값 여부 | q.isEmpty() | |
추가 | q.offer(x) | 맨 뒤에 삽입 |
삭제 | q.poll() | 맨 앞 값 반환, 삭제 |
맨 앞 | q.peek() | 맨 앞 값 반환 |
전체 삭제 | q.clear() | 공백 큐 |
우선순위큐
LinkedList로 구현하는 큐와 사용하는 메소드 유사
1
2
| Queue<Integer> pq = PriorityQueue<Integer>(); // 최소힙
Qeueu<Integer> pq = PriorityQueue<Integer>(Collections.reverseOrder()); // 최대힙
|
특정 기준으로 정렬하고 싶을 때 다음을 이용
- implements Comparable하여 compareTo 오버라이딩
- pq 선언시 Comparator 생성하여 compare 오버라이딩
Math 라이브러리
Operation | Example | Note |
---|
큰 값 | Math.max(n1, n2) | |
작은 값 | Math.min(n1, n2) | |
절대값 | Math.abs(n) | |
n 제곱 | Math.pow(base, n) | |
제곱근 | Math.sqrt(n) | |
반올림 | Math.round(n) | 소수점 첫번째 자리에서 반올림 |
내림 | Math.floor(n) | |
올림 | Math.ceil(n) | |
참고
알고리즘을 위한 자바 함수 정리
[Java] 코딩테스트 문법 속성 정리 (1)
[Java] 코딩테스트 문법 속성 정리 (2)
[JAVA] 코딩테스트용 주요 함수 모음