2023.12.18 Updated
자바 코딩 테스트를 준비하면서 필수적으로 알아야할 문법을 정리하고 있습니다.
최대한 간략하게 예시와 함께 설명하는 형태로 정리중이며, 속도 등 같은 기능을 수행하는 기술 간 차이점에 대한 증명 자료는 따로 첨부하지 않았습니다.
https://devdocs.programmers.co.kr/references/java/docs/api/index.html
코딩 테스트를 보실 때 대부분 환경에서 document 사용을 지원합니다.
그래서 사용법을 잊어먹었을 때는 간단하게 찾아서 읽어볼 수 있는 정도는 할 줄 알면 좋습니다.
코딩테스트 클래스 명명법
백준은 Main을 클래스 이름으로 사용합니다.
SWEA는 Solution을 클래스 이름으로 사용합니다.
public class Main { psvn } // 백준
public class Solution { psvn } // SWEA
필수 입력
Scanner 등 필요한 패키지 import 용으로 작성합니다.
시작 시 아래 코드를 직접 입력, 또는 ctrl + shift +o를 통해서 필요한 import문을 자동 입력합니다.
import java.io.*;
import java.util.*;
입력 받기 1 : Scanner
$ sc.next~()
Scanner를 이용한 가장 기본적인 입력 받는 방법입니다.
Scanner sc = new Scanner(System.in);
int i = sc.nextInt();
long l = scanner.nextLong();
double d = scanner.nextDouble();
String s = scanner.nextLine();
입력 받기 2 : BufferedReader
$ br.readLine()
공백 등으로 분리되어 많은 입력이 일어나는 경우 BufferedReader를 이용한 입력을 사용하면 속도면에서 효율적입니다.
Integer.parseInt(), split() 등을 함께 사용합니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine()); // br을 통해서 숫자 하나를 입력받는 경우
String[] a = br.readLine().split(" "); // 공백으로 나뉜 값 입력 받는 경우
입력 받기 3 : BufferedReader + StringTokenizer
$ st = new StringTokenizer(br.readLine(), " ");
StringTokenizer를 이용한 입력 방법입니다.
2번과 같이 공백 등으로 입력을 분리하여 쓰는 경우 유용하며, 가장 속도가 빠르다고 알려져 있습니다.st.nextToken()을 사용하여 다음 값을 불러올 수 있습니다.
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 첫 번째 줄 입력 예시 = 3 5
StringTokenizer st = new StringTokenizer(br.readLine()); // 첫 번째 줄 읽어옴
int N = Integer.parseInt(st.nextToken()); // 3
int M = Integer.parseInt(st.nextToken()); // 5
int[] cardArray = new int[N];
// 두 번째 줄 입력 예시 = 1 2 3
st = new StringTokenizer(br.readLine()); // 두 번째 줄 읽어옴
for (int i = 0; i < N; i++) {
cardArray[i] = Integer.parseInt(st.nextToken()); // 1, 2, 3
}
// 두 번째 줄 입력 예시 = 1 2 3
st = new StringTokenizer(br.readLine()); // 두 번째 줄 읽어옴
// Tokenizer가 빌때까지 반복
while(st.hasMoreTokens()) {
System.out.println(st.nextToken());
}
문자 입력 받기
$ .charAt(인덱스)
인덱스는 문자열에서 몇 번째 문자를 char로 변환할지를 정합니다. 하나의 문자만 받는 경우 0을 지정하시면 됩니다.
숫자를 입력받는 경우 인덱스를 생략합니다.
char c = br.readLine().charAt(0);
테스트 케이스 input 적용하기
$ System.setIn(new FileInputStream("파일_경로"));
테스트 케이스를 텍스트 파일에 입력한 후 실행 시 자동으로 입력되도록 할 때 사용합니다.
이클립스 기준 src 폴더와 동일 선상에 파일을 저장하면 됩니다.
System.setIn(new FileInputStream("res/1986/input.txt"));
문자를 숫자로 변환
숫자를 문자로 변환
// 문자 -> 숫자 (char -> int)
// $ 숫자 - '0'
char c = '8';
int i = c - '0';
// 숫자 -> 문자 (int -> char)
// $ (char)(숫자 + '0')
int i = 8;
char c = (char)(i + '0');
대(소)문자 문자 -> 소(대)문자 문자
$ Character.toUpperCase(문자)
char c = 'A';
// 대 -> 소
c = Character.toLowerCase(c);
// 소 -> 대
c = Character.toUpperCase(c);
문자 대소문자 체크
$ Character.isUpperCase(문자)
char c = 'A';
boolean b = Character.isLowerCase(c); // false
b = Character.isUpperCase(c); // true
문자 대소문자 체크 (ASCII)
65 <= 대문자 <= 90
97 <= 소문자 <= 122
대문자 = 소문자 - 32
소문자 = 대문자 + 32
if (c >= 65 && x <= 90) {
// 대문자
} else {
// 소문자
}
문자 알파벳 여부 체크
Character.isAlphabetic('A');
문자가 알파벳이면 true, 그밖에 특수문자이면 false를 반환합니다.
문자 숫자 여부 체크
char c = '999';
Character.isDigit(c); // true
문자 첫 번째 등장 위치 확인
String s = "Angel";
s.indexOf('A'); // 0
indexOf()는 찾고자 하는 요소나 부분 문자열이 처음으로 등장하는 인덱스를 반환합니다.
문자열 -> 대문자 문자열
문자열 -> 소문자 문자열
$ 문자열.toUpperCase()
String s = "AngelPlayer";
String upper = s.toUpperCase();
System.out.println(upper); // ANGELPLAYER
String lower = s.toLowerCase();
System.out.println(lower); // angelplayer
문자열을 숫자로 변환 (String to int)
$ Integer.parseInt(문자열)
여러 방법이 있지만 숫자를 문자열과 함께 외울 수 있기 때문에 저는 Integer.parseInt()를 통한 방법을 사용합니다.
int num = Integer.parseInt("100");
숫자를 문자열으로 변환 (int to String)
$ Integer.toString(문자열)
Integer.toString()을 통해서 숫자를 문자열로 변환할 수 있습니다.
String string = Integer.toString(100);
문자열을 여러 번 합쳐야 할 때 String 대용
문자열의 더하기 연산이 계속되면 시간 초과가 발생할 수 있는데, 이때 StringBuilder를 사용하면 해결할 수 있습니다.
-> 대표 예제 문제 : 백준 17413
StringBuilder sb = new StringBuilder();
sb.append("Angel");
sb.append('8');
sb.append("Player");
sb.apppend(8);
System.out.println(sb); // Angel8Player8
문자열 자르기
$ 문자열.substring(시작인덱스, 끝인덱스);
$ 문자열.substring(시작인덱스);
String s = "AngelPlayer";
System.out.println(s.substring(5, 9)); // Play
System.out.println(s.substring(5)); // Player
두 개의 파라미터를 가지는 경우 시작 인덱스부터 끝 인덱스까지를 출력합니다.
이 때, 끝 인덱스 번호의 문자는 포함 되지 않습니다.
(위 예시에서 9는 e인데, e는 포함되지 않고 play 까지만 출력됩니다.)
반대로 하나의 파라미터를 가지는 경우, 시작 인덱스부터 마지막까지를 출력합니다.
문자열 -> 문자 배열
문자 배열 -> 문자열
String s = "Angel";
char[] arr = s.toCharArray(); // 문자열 -> 캐릭터 배열
String newS = String.valueOf(arr); // 배열 -> 문자열
System.out.println(newS);
문자열을 쪼개서 문자 배열로 만들거나, 반대로 문자 배열을 합쳐서 문자열로 만들어야 하는 경우 사용합니다.
문자 치환
$ 문자열.replaceAll('바꿀_문자', '바뀔_문자')
정규식
$ 문자열.replaceAll("[정규식]", 변환)
String s = " A!N@G#E$L";
// A에서 Z까지가 아닌 문자는 모두 ""로 치환
s = s.replaceAll("[^A-Z]", ""); // ANGEL
문자열 뒤집기
String s = "Angel";
String temp = new StringBuilder(s).reverse().toString(); // legnA
n진수 -> 10진수
String s = "1000001";
int num = Integer.parseInt(s, 2); // 2진수를 10진수로 바꿈
System.out.println(num); // 65
자바에서 진수 변환은 Integer.parseInt()를 사용해서 할 수 있습니다.
ASCII -> int
int -> ASCII
char c = 'A';
int charToInt = (int) c;
System.out.println(charToInt); // 65
char intToChar = (char) charToInt;
System.out.println(intToChar); // A
코딩테스트에서 간간히 ascii 코드와 관련한 문제가 나오곤 합니다.
형변환을 통해서 숫자를 ascii 문자로, ascii 문자를 해당 하는 숫자로 바꿀 수 있습니다.
배열 출력하기
$ Arrays.toString(배열명)
자바에서 배열명을 sout()으로 출력한다면 배열의 주소가 나오는 것을 확인할 수 있습니다.
따라서 Arrays.toString()을 사용해서 해당 결과를 출력해야 배열의 값을 확인할 수 있습니다.
배열 복사 / 크기 늘리기
$Arrays.copyOf(배열, 크기)
배열은 크기를 늘릴 수 없으므로 새로운 배열을 생성 후 할당해주는 방식으로 늘릴 수 있습니다.
다른 변수에 해당 기능을 사용함으로써 복사하는 것과 같은 효과도 낼 수 있습니다.
int[] arr = {1,2,3,4,5};
arr = Arrays.copyOf(arr, 10); // {1,2,3,4,5,0,0,0,0,0}
배열 일부만 자르기
$ Arrays.copyOfRange(배열, 시작_인덱스, 끝_인덱스)
return Arrays.copyOfRange(userList, 0, nowSize);
배열 정렬
$ Arrays.sort(배열, 설정)
// 오름차순 정렬 {1, 2, 3, 4}
Arrays.sort(array);
// 내림차순 정렬 {4, 3, 2, 1}
Arrays.sort(array, Collections.reverseOrder());
HashSet은 중복을 허용하지 않으며, 순서를 가지지 않습니다.
set 생성
$ HashSet<Integer> set = new HashSet<>();
set -> array
$ Integer[] answer = set.toArray(new Integer[0]); // 0으로 해서 크기를 지정할 수 있음
array -> set
$ Set<Integer> set = new HashSet<Integer>(Arrays.asList(arr));
리스트 생성
$ ArrayList<타입> 리스트명 = new ArrayList<>();
ArrayList<Integer> list = new ArrayList<>();
리스트에 요소 추가
$ 리스트명.add(값);
$ 리스트명.add(인덱스, 값);
list.add(1);
리스트 요소 가져오기
$ 리스트명.get(인덱스);
list.get(1);
리스트 요소 제거
$ 리스트명.remove(인덱스);
list.remove(2);
리스트 탐색
$ 리스트명.indexOf(값) // 리스트의 위치를 알려줌
$ 리스트명.contains(값) // 리스트의 존재 여부를 알려줌
int i = list.indexOf(8); // 존재하면 인덱스, 없으면 -1 리턴
boolean b = list.contains(8); // 값 존재 유무 리턴
정렬
$ 리스트명.sort(옵션);
list.sort(Comparator.naturalOrder()); // 오름차순 정렬
list.sort(Comparator.reverseOrder()); // 내림차순 정렬
뒤집기
$ Collections.reverse(리스트명)
Collection interface
contains(Object o); // 요소를 포함하고 있는지 판단
size();
List
ArrayList와 LinkedList를 가짐
// $ ArrayList<타입> 리스트명 = new ArrayList<>();
List<String> names = new ArrayList<>();
// List<String> names = new LinkedList<>();
// 리스트 요소 추가하기
// $ 리스트명.add(인덱스, 요소);
names.add("Angel"); // 요소 추가하기
names.add("Player");
names.add("Angel");
names.add("Player");
names.addAll(0, "Hola"); // 특정 위치에 요소 추가하기
System.out.println(names); // [Hola, Angel, Player, Angel, Player]
// 요소 가져오기
// $ 리스트명.get(인덱스);
System.out.println(names.get(0)); // Hola
// 요소 변경하기
// $ 리스트명.set(인덱스, 값);
names.set(0, "AngelPlayer");
// 요소가 존재하는지 확인
// $ 인덱스명.contains(요소);
System.out.println(names.contains("Angel")); // true
// 요소의 인덱스 확인
// $ 인덱스명.indexOf(요소);
System.out.println(names.indexOf("Angel")); // 1
System.out.println(names.indexOf("Hola")); // -1
// 요소 삭제
names.remove(1); // 인덱스1의 값 제거
names.remove("Angel");
System.out.println(names); // [AngelPlayer, Player, Player]
set
순서 상관 없음
중복 없음
Set<Object> names = new HashSet<Object>();
names.add(Integer.valueOf(1));
names.add("Angel");
names.add("Angel"); // 중복 데이터는 추가해도 무시
names.add(1); // 기본형은 wrapper를 통해 추가해야 함
names.add("Player");
// names.remove(1); // 인덱스를 통한 삭제 불가능
// names.set(0, "AngelPlayer"); // 데이터 업데이트 불가능
스택
$ Stack<레퍼런스 타입> 스택명 = new Stack<>();
Stack<Integer> s = new Stack<>(); // 선언
s.push(8); // 스택에 값 추가
s.pop(); // 스택의 값 하나 꺼내기
s.size(); // 스택안의 개수 출력 | int
s.empty(); // 스택이 비었는지 확인 | t/f
s.contains(값); // 스택 안에 데이터 있는지 여부 확인 | t/f
Queue
Queue<Integer> q = new LinkedList<>(); // 생성
q.offer(1); // 추가
q.offer(2);
q.poll(3); // 꺼내기
Map (HashMap)
key-value 쌍을 가지는 자료구조
HashMap의 경우 입력순서를 가지지 않음
// 선언
HashMap<Character, Integer> map = new HashMap<>();
// 삽입
map.put('A', 1); // map에 key-value 쌍 삽입
map.put('N', 1); // map에 key-value 쌍 삽입
// 반환
System.out.println(map.get('A')); // 1
System.out.println(map.get('H')); // null
System.out.println(map.getOrDefault('H', 0)); // 0
// 업데이트
map.put(N, map.get(N) + 1); // update
// 전체 출력
System.out.println(map); // {A=1, N=2}
// 크기 반환
System.out.println(map.size()); // 2
// 순회
for (Character key: map.keySet()) {
System.out.println(key + " : " + map.get(key));
}
// key 삭제
System.out.println(map.remove('A')); // 삭제, 삭제하면서 value값 반환
[Baekjoon] 백준 11660 구간 합 구하기 5 (S1^ / 누적합) - Java (1) | 2024.01.15 |
---|---|
[인프런] 최대 길이 연속 부분 수열 (투 포인터^) (2) | 2024.01.10 |
[Baekjoon] 백준 5582 공통 부분 문자열 (G5^ / DP) - Java (0) | 2023.10.31 |
[알고리즘] 최장 공통 문자열(LCS : Longest Common Substring) 알고리즘 (2) | 2023.10.30 |
[Baekjoon] 백준 18405 전염 (G5^ / BFS, PQ) - Java (1) | 2023.10.28 |