코딩 테스트를 풀다 보면 알고리즘 자체보다 Java 문법이나 기본 API가 손에 익지 않아서 시간이 걸릴 때가 있다. 자주 쓰는 배열, 리스트, 문자열 메서드는 따로 외운다기보다 여러 문제를 풀면서 바로 떠올릴 수 있을 정도로 익혀두는 편이 좋다.

배열

배열은 크기가 고정된 자료구조다. 인덱스로 바로 접근할 수 있고, 길이는 arr.length로 확인한다. 배열 전체를 출력할 때는 그냥 System.out.println(arr)을 쓰면 주소처럼 보이기 때문에 Arrays.toString을 사용한다.

int[] arr = new int[5];
 
System.out.println(arr.length);
System.out.println(Arrays.toString(arr));
 
int[] copied = Arrays.copyOf(arr, arr.length);

2차원 배열처럼 중첩된 배열을 확인할 때는 Arrays.deepToString이 편하다.

int[][] board = new int[3][3];
System.out.println(Arrays.deepToString(board));

리스트

리스트는 크기가 동적으로 변하는 자료구조가 필요할 때 자주 쓴다. 보통 ArrayList를 가장 많이 사용하고, 값 추가와 삭제, 크기 확인, 정렬이 기본 패턴이다.

List<Integer> list = new ArrayList<>();
 
list.add(10);
list.add(20);
list.remove(Integer.valueOf(10));
 
System.out.println(list.size());
Collections.sort(list);
System.out.println(list);

list.remove(1)처럼 숫자를 넘기면 인덱스 삭제로 해석된다. 값 자체를 지우고 싶다면 Integer.valueOf(1)처럼 객체로 감싸서 넘기는 점을 조심해야 한다.

문자열

문자열에서는 길이, 자르기, 비교, 문자 배열 변환을 많이 쓴다. Java에서는 문자열 비교를 ==로 하지 않고 equals로 해야 한다.

String str = "algorithm";
 
int length = str.length();
String part = str.substring(0, 4);
boolean same = str.equals("algorithm");
char[] chars = str.toCharArray();
int index = str.indexOf('r');
String[] words = str.split(" ");

입력과 문자열 조립

입력은 문제 유형에 따라 Scanner, BufferedReader를 고르게 된다. 간단한 문제에서는 Scanner가 편하지만, 입력이 많으면 BufferedReaderStringTokenizer를 쓰는 편이 안전하다.

Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
String text = scanner.nextLine();

문자열을 반복해서 붙일 때는 StringBuilder를 사용하는 것이 좋다. 반복문 안에서 +로 문자열을 계속 만들면 매번 새로운 문자열이 생겨 비효율적일 수 있다.

StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("World!");
 
String result = sb.toString();

마지막으로 continuebreak는 반복문 흐름을 정리할 때 자주 쓴다. continue는 현재 반복만 건너뛰고 다음 반복으로 넘어가고, break는 반복문 자체를 끝낸다. 조건이 복잡한 문제에서는 이 둘을 적절히 쓰면 중첩을 조금 줄일 수 있다.