코딩테스트 공부하면서 작성하는 노트!!
택스트 색 변경
배경 색 변경
long sqrt = (long)Math.sqrt(n); // n의 제곱근 반환
long pow = (long)Math.pow(sqrt, 2); // sqrt의 2제곱 반환
int random = (int)(Math.random() * 45) + 1; // 1부터 45까지의 난수 반환
... Math.abs(-10); // 10 (절대값 반환)
... Math.max(10, 20); // 20 (더 큰 수 반환)
... Math.min(10, 20); // 10 (더 작은 수 반환)
... Math.ceil(9.2); // 10.0 (올림)
... Math.floor(9.2); // 9.0 (내림)
... Math.round(9.5); // 10.0 (반올림)
동기화는 동시 환경에서 여러 스레드가 공유 리소스에 대한 액세스를 제어하는 메커니즘입니다. 한 번에 하나의 스레드만 리소스에 액세스할 수 있도록 하여 데이터 손상을 방지하고 스레드 안전성을 보장합니다.
import java.util.Stack;
Stack<Integer> stack = new Stack<>();
// 요소를 스택의 맨 위에 추가 (Deque와 작동 방식이 다르다.)
stack.push(element);
// 스택 맨 위의 객체를 반환하고 제거
stack.pop();
// 스택 맨 위의 객체를 반환
stack.peek();
// 스택이 비어있는지 확인 (true or false)
stack.isEmpty();
import java.util.ArrayDeque;
import java.util.Deque;
Deque<Integer> deque = new ArrayDeque<>();
// 데크 맨 앞에 요소를 추가 -> 삽입 실패시 IllegalstateException
stack.addFirst(element);
// 삽입 가능한 경우(용량이 충분한 경우 등) 데크 맨 앞에 요소를 추가 -> 예외 발생 x
stack.offerFirst(element); // boolean 반환
// 데크 맨 끝에 요소를 추가
stack.addLast(element);
// 삽입 가능한 경우(용량이 충분한 경우 등) 데크 맨 끝에 요소를 추가 -> 예외 발생 x
stack.offerLast(element); // boolean 반환
// 데크 맨 앞에(헤드 부분에 요소를 추가
stack.push(element);
// 데크 첫번째 요소를 반환하고 제거 -> 덱이 비어있는 경우 NoSuchElementException 예외 발생
stack.removeFirst();
// 데크 첫번째 요소를 반환하고 제거 -> 덱이 비어있는 경우 예외를 발생시키지 않고 null 반환
stack.pollFirst();
// 데크 마지막 요소를 반환하고 제거 -> 덱이 비어있는 경우 NoSuchElementException 예외 발생
stack.removeLast();
// 데크 마지막 요소를 반환하고 제거 -> 덱이 비어있는 경우 예외를 발생시키지 않고 null 반환
stack.pollLast();
// 데크 마지막 요소를 반환하고 제거 -> 덱이 이미 비어있는 경우 NoSuchElementException 예외 발생
stack.pop();
// 데크의 첫번째 요소를 반환 -> 덱이 비어있는 경우 NoSuchElementException 예외 발생
stack.getFirst();
// 데크의 첫번째 요소를 반환 -> 덱이 비어있는 경우 예외를 발생시키지 않고 null을 반환
stack.peekFirst();
// 데크의 마지막 요소를 반환 -> 덱이 비어있는 경우 NoSuchElementException 예외 발생
stack.getLast();
// 데크의 마지막 요소를 반환 -> 덱이 비어있는 경우 예외를 발생시키지 않고 null을 반환
stack.peekLast();
// 데크의 헤드(첫번째) 요소를 반환 -> 덱이 비어있는 경우 NoSuchElementException 예외 발생
stack.element();
// 데크의 헤드(첫번째) 요소를 반환 -> 덱이 비어있는 경우 예외를 발생시키지 않고 null 반환
stack.peek();
// 데크 요소의 수를 반환
stack.size();
// 데크가 비어있는지 확인 -> boolean 반환
stack.isEmpty();
// 데크에 요소가 포함되어 있는지 검색 -> boolean 반환
stack.contains(element);
// 데크의 모든 요소를 제거
stack.clear();
// 데크의 모든 요소를 배열로 반환
stack.toArray();
데이터의 우선순위에 따라 정렬된 상태로 관리되는 자료구조이다.
우선순위 큐는 내부적으로 힙(heap) 자료구조를 사용하여 구현되므로, 요소 삽입, 제거, 검색 등의 연산이 효율적으로 수행될 수 있다.
힙 자료구조를 사용하므로 일반적인 큐에 비해 메모리 사용량이 증가할 수 있다.
Comparable 인터페이스를 구현해 요소 간 우선순위 비교 기준을 정의할 수 있다.
기본 자료형 Integer나 String으로 생성하면 오름차순으로 우선순위가 정해진다.
import java.util.PriorityQueue;
PriorityQueue<Integer> priQueue = new PriorityQueue<>();
// 큐에 요소를 추가
priQueue.offer(element);
// 가장 우선순위가 높은 요소를 제거하고 반환
priQueue.poll();
// 주어진 요소를 제거
priQueue.remove(element);
// 가장 우선순위가 높은 요소를 반환
priQueue.peek():;
// 큐에 주어진 요소가 포함되어 있는지 확인 -> boolean 반환
priQueue.contains(element);
// 큐에 포함된 요소의 개수를 반환
priQueue.size();
// 큐가 비어있는지 확인 -> boolean 반환
priQueue.isEmpty();
// 큐의 모든 요소를 제거
priQueue.clear();
// 큐의 모든 요소를 배열로 반환
priQueue.toArray();
String a = "abc";
StringBuilder sb = new StringBuilder();
sb.append(a); // 문자열 추가
sb.insert(n, a); // n번째에 문자열 추가
sb.delete(n, m); // n번째부터 m번째까지의 문자열 삭제
sb.replace(n, m, a); // n번째부터 m번째까지의 문자열 교체
sb.substring(n, m); // n번째부터 m번째까지의 문자열 반환
sb.length(); // 문자열 길이 반환
sb.setLength(); // 문자열 길이 설정
sb.reverse(); // 문자열 반전
sb.toString(); // 문자열을 반환
List<String> list = new ArrayList<>();
// index에 값을 추가한다.
list.add(int index, Object element);
//index위치의 값을 변경하고 Object 타입으로 리턴한다.
list.set(int index, Object element);
// start부터 end에 있는 객체를 반환한다. List 타입으로 리턴한다.
list.subList(int start, int end);
// index 위치에 있는 값을 삭제한다. Object 타입으로 리턴한다.
list.remove(int index);
// list가 비어있는지 확인한다. boolean 타입으로 티턴한다.
list.isEmpty();
// list의 길이를 반환한다.
list.size();
// list에 element가 있는지 확인한다. boolean 타입으로 리턴한다.
list.contains(Object element);
// index번째 list 요소를 Object 타입으로 반환한다.
list.get(int index);
// 순방향 / 역방향으로 탐색하여 주어진 객체의 위치를 반환한다. int 타입으로 리턴한다.
list.indexOf(Object o); / lastIndex(Object o);
객체가 인덱스로 관리된다는 점에서 배열과 유사하다. 그러나 배열은 생성될 때 크기가 고정되며, 크기를 변경할 수 없지만 ArrayList는 저장 용량을 초과하여 객체들이 추가되면, 자동으로 저장용량이 늘어나게 된다. 또한 데이터가 연속적으로 존재하여 데이터의 순서가 유지된다.
특정 인덱스의 객체를 제거하면, 바로 뒤 인덱스부터 마지막 인덱스까지 모두 앞으로 1씩 당겨진다.
ArrayList에 객체를 순차적으로 저장할 때에는 데이터를 이동하지 않아도 되므로, 작업 속도가 빠르지만, 중간에 위치한 객체를 추가, 삭제할 때에는 데이터 이동이 많이 일어나므로 속도가 저하된다.
반면 인덱스가 n인 요소인 데이터에 빠르게 접근이 가능하기 때문에 검색(읽기) 측면에서는 유리하다.
ArrayList<String> list = new ArrayList<String>();
// 초기 용량을 명시적으로 전달하지 않으면 기본적으로 10으로 설정된다.
// 배열의 오름차순 정렬
Arrays.sort(Object[] array);
// 배열을 문자열 형식으로 변환
Arrays.toString(Object[] array);
// 요소의 존재 여부 확인 boolean 타입으로 반환
Arrays.indexOf(Object[] array, Object element);
import java.util.Collections;
// list를 오름차순 정렬한다.
Collections.sort(List<T> list);
// list를 내림차순 정렬한다.
Collections.sort(List<T> list, Collections.reverseOrder());
// list의 요소 순서를 뒤집는다.
Collections.reverse(List<T> list);
import org.springframework.web.context.request.async.DeferredResult;
DeferredResult<String> deferredResult = new DeferredResult<>();
DeferredResult<ResponseEntity<String>> deferredResult = new DeferredResult<>();
String s = "hello world";
String[] str = s.split(""); // ["h", "e", "l", "l", "o"," ", "w", "o", "r", "l", "d"]
String[] str = s.split(" "); // ["hello", "world"]
String[] str = s.split("(?=\\s)"); // ["hello", " world"]
String[] str = s.split("(?<=\\s)"); // ["hello ", "world"]
String[] str = s.split("(?<=\\s)|(?=\\s)"); // ["hello", " ", "world"]
str.length; // 요소의 개수
char c = 'a';
Character.isUpperCase(c); // false
Character.isLowerCase(c); // true
char c = 'a';
Character.toUpperCase(c); // A
Character.toLowerCase(c); // a
String str = "ABC";
str.toLowerCase(); // abc
str.toUpperCase(); // ABC
String str = "ABC";
str.charAt(i); // i=1 이라면 A
String str = " AB CD ";
str.trim(); // "AB CD"로 반환됨
String a = "bbba123@naver.com"
int index = a.indexOf('a'); // 3
문자가 여러개 있더라도 가장 앞에 위치하는 문자의 index 하나만 반환한다.
String str = "abcd";
str.substring(n, m);
n=0, m=2일때는 ab로 출력된다. m번째 바로 이전까지 반환됨.
m을 생략하고 n만 작성한다면 str.substring(n); n번째부터 문자열 끝까지 반환됨// substring은 index로도 활용할 수 있다. String a = "abc123@naver.com" int index = a.indexOf('a'); String b = a.substring(index+1); // naver.com (도메인이 반환된다.)
String str = "abc";
str.repeat(n);
int a = 10;
String str = Integer.toString(a); // "10"
String str = Long.toString(a); // "10"
String str = Double.toString(a); // "10"
...
String str = String.valueOf(a); // "10"
String a = "abc";
String[] str = a.split("");
String a = "abc";
String[] str = a.split("");
Arrays.toString(str); // [a, b, c]
배열의 내용을 다른 문자열과 합치거나, 배열의 값을 출력할때 주로 사용된다.
String a = "abc";
String[] str = a.split("");
String.join("", str); // abc
String a = "abc";
String[] str = Integer.toString(a).split("");
String[] str = String.valueOf(a).split("");
String [] str = {"kim", "park", "lee", ...};
str[i].equals("kim")...
String a = "123";
int b = Integer.parseInt(a);
만약 int로 변환 할 수 없는 형식의 문자열(ex: String)이 입력된다면, NumberFormatException 예외가 발생한다.
int a = 100;
Integer.toString(a, n);
int a = 100;
Integer.parseInt(a, n);
String[] arr = {"1-1","1-2","1-3","1-4","1-5"};
for(String s : arr) {
System.out.println(s);
}
// 이차원 배열
String[][] arr = {{"1-1","1-2","1-3","1-4","1-5"},{"2-1","2-2","2-3","2-4","2-5"}};
for(String[] arrs : arr) {
for(String s : arrs) {
System.out.println(s);
}
}
ArrayList<String> arrlist = new ArrayList<String>();
arrlist.add("1-1");
arrlist.add("1-2");
arrlist.add("1-3");
for(String s : arrlist) {
System.out.println(s);
}
| 기호 | 의미 | 설명 |
|---|---|---|
| . | 임의의 문자 1개 | a.c : a로 시작하고 c로 끝나는 모든 문자 |
| ^ | 시작을 의미한다. [] 괄호 안에 있다면 일치하지 않는 부정의 의미로로 쓰인다. | ^a : a로 시작하는 단어 [^a] : a가 아닌 문자 1개 [^a-z0-9.-] : 영어 소문자, 숫자, .(dot), - 를 제외한 모든 문자 |
| $ | $앞의 문자열로 문자가 끝나는지를 의미한다. | a$ : a로 끝나는 단어 ^\\.|\\.$ : .으로 시작하거나 .으로 끝나는 문자 |
| [] | [] 괄호 안의 문자가 있는지를 확인한다. | [ab][cd] : a와b중 하나의 문자와 c와d중 하나의 문자 [abp] : a,b,p 문자 |
| - | 사이, 범위를 지정한다. | [a-z] : 알파벳 소문자 a부터 z까지 하나 [a-z0-9] : 알파벳 소문자 전체,0~9 중 한 문자 |
| | | or | [a|b] : a 혹은 b |
| () | 그룹 | 01(0|1) : 01뒤에 0 또는 1이 들어간다 → 010(o), 011(o), 012(x) |
| {} | 개수 | a{3}b : a가 3번 온 후 b가 온다 → aab(x), aaab(o), aaaab(o) \\.{2,4} : .이 2~4회 연속하는 문자 a{3,} : a가 3개 이상인 문자 |
| \d | 모든 숫자 [0-9]와 같은 의미 | \\d로 사용 |
| \D | 숫자가 아닌 모든 문자 [^0-9]와 같은 의미 | \\D로 사용 |
| \s | 공백, tab을 의미 | \\s로 사용 |
| \S | 공백, tab이 아닌 문자 | \\S로 사용 |
| \w | 일반문자를 의미한다. [a-zA-Z_0-9]와 같은 의미 | \\w로 사용 |
| \W | 일반문자가 아닌 문자 [^a-zA-Z_0-9]와 같은 의미 | \\W로 사용 |
| ? | 앞의 표현식이 없는 or 최대 한개만 존재하는 문자 | a1? : 1이 없거나 최대 1개 |
| + | 앞의 표현식이 1개 이상 or 여러개인 문자 | a1+ : 1이 최소 1개 이상 |
| * | 앞의 표현식이 없는 or 1개 이상인 문자 | a1* : 1이 있을수도 없을수도 있다 |
| (?=) | 가장 앞 문자를 기준으로 검색 | |
| (?<=) | 가장 뒷 문자를 기준으로 검색 |
✅ (?=) 와 (?<=)에 대해서!!
아래와 같은 코드가 있다고 했을 때,String text = "This is a sample text"; Pattern pattern = Pattern.compile("(.+)(?=sample)"); Matcher matcher = pattern.matcher(text); while (matcher.find()) { System.out.println("검색 : '" + matcher.group() +"'"); }
compile("(.+)(?=sample)");으로 검색하면 sample의 가장 앞 문자인 s를 기준으로 전방 검색하게 되고,검색 : 'This is a '라고 출력된다.
(가장 앞 문자에서 전방 검색을 하게되면 검색어 문자가 미 포함된다.)compile("(.+)(?<=sample)");으로 검색하면 sample의 가장 뒷 문자인 e를 기준으로 전방 검색하게 되고,검색 : 'This is a sample'라고 출력된다.
(가장 뒤 문자에서 전방 검색을 하게되면 검색어 문자가 포함된다.)
3.compile("(?=sample)(.+)");으로 검색하면 sample의 가장 앞 문자인 s를 기준으로 후방 검색하게 되고,검색 : 'sample text'라고 출력된다.
(가장 앞 문자에서 후방 검색하게 되면 검색어 문자가 포함된다.)compile("(?<=sample)(.+)");으로 검색하면 sample의 가장 뒤 문자인 e를 기준으로 후방 검색하게 되고 ,검색 : ' text'라고 출력된다.
(가장 뒤 문자에서 후방 검색을 하게 되면 검색어 문자가 미 포함된다.)
| 정규 표현식 | 설명 |
|---|---|
| ^[0-9]*$ | 숫자 |
| ^[a-zA-Z]*$ | 영문 |
| ^[가-힣]*$ | 한글 |
| ^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ | 핸드폰번호 |
| \d{6} - [1-4]\d{6} | 주민등록번호 |
| ^\d{3}-\d{2}$ | 우편번호 |
String str = "1";
boolean result = str.matches("[0-9]"); // true 반환
String str1 = "123abc";
String str2 = str1.replaceAll("\\d",""); // 모든 숫자를 치환한다.
System.out.println(str2); // abc 출력
String str1 = ".123abc.";
String str2 = str1.replaceAll("^\\.|\\.$",""); // 문자열 시작과 끝에 있는 .(dot)을 치환한다.
System.out.println(str2); // 123abc 출력
String str = "^[0-9]*$";
Pattern pattern = Pattern.compile(str);
String str = "123123";
boolean result = Pattern.matches("^[0-9]*$", str); // 검증 대상
System.out.println(result); // true
String str = "123abc";
String patternString = "^[0-9]+";
// 문자열을 정규표현식 패턴 객체로 변환
Pattern pattern = Pattern.compile(patternString);
// 패턴 객체로 matcher 메서드를 통해 문자열을 검사하고 결과를 matcher 객체로 반환
Matcher matcher = pattern.matcher(txt);
// Matcher 클래스 메소드를 통해 결과를 출력
System.out.println(matcher.find()); // true 출력
System.out.println(matcher.group()); // 1487 출력
| Matcher 클래스 메서드 | 설 명 |
|---|---|
| find( ) | 패턴이 일치하는 경우 true를 반환, 불일치하는 경우 false반환 |
| find(int index) | index 위치 이후부터 매칭검색 |
| start( ) | 매칭되는 문자열의 시작위치 반환 |
| start(int index) | 지정된 그룹이 매칭되는 시작위치 반환 |
| end( ) | 매칭되는 문자열 끝위치의 다음 문자위치 반환 |
| end(int index) | 지정된 그룹이 매칭되는 끝위치의 다음 문자위치 반환 |
| group( ) | 매칭된 부분(값)을 반환 |
| group(int index) | 그룹화되어 매칭된 패턴중 ndex번째 부분 반환 |
| groupCount( ) | 그룹핑한 패턴의 전체 개수 반환 |
| matches( ) | 패턴이 전체 문자열과 일치할 경우 true반환 |
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main(String[] args) {
// 비교할 문자열
String str = "1234문자";
// 문자열 형태의 정규표현식 문법
String patternString = "[^0-9]+";
// 1) 문자열 형태의 정규표현식을 패턴 객체로 컴파일
Pattern pattern = Pattern.compile(patternString);
// 2) 패턴 객체로 matcher 메서드를 통해 문자열을 검사하고 필터링된 결과를 매처 객체로 반환
Matcher matcher = pattern.matcher(str);
// 3) 정규식 필터링된 결과를 담은 matcher에서 메소드를 통해 결과를 출력
System.out.println(matcher.find()); // true
System.out.println(matcher.group()); // 문자
// group이 여러개일 경우에는 반복문을 통해 반환해준다
while (matcher.find()) {
System.out.println(matcher.group());
}
// while 활용
// 매칭된 부분을 index를 사용하여 일부만 반환 할 수도 있다.
while (matcher.find()) {
System.out.println(matcher.group() + " -> " + matcher.group(1) + ", " + matcher.group(2) + ", " + matcher.group(3));
}
// 매칭된 위치를 반환
while (matcher.find()) {
// start()와 end()로 일치하는 부분의 위치를 알아낼 수 있다.
System.out.println("매칭되는 문자열 위치 : " + matcher.start() + " ~ " + matcher.end());
// 출력 : 매칭되는 문자열 위치 : 4 ~ 6
}
}
}