헷갈리는 개념들 모아모아 정리하기!
+) 참고하면 좋을 블로그: Java 코딩테스트 관련 팁
✔️ 배열, 리스트, 문자열 크기
- 배열: length 변수 사용
- arraylist: size() 메서드 사용
- 문자열 크기: length() 메서드 사용
// 배열
int[] arr = {1,2,3,4,5};
System.out.println(arr.length); // 5
// 리스트
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
System.out.println(list.size()); // 3
// 문자
String str = "hello";
System.out.println(str.length()); // 5
✔️ Math.sqrt(), Math.pow()
- Math.sqrt(): 제곱근
- Math.pow(): 거듭 제곱 => double 형이 반환되니까 int로 사용하려면 (int)를 붙여 타입캐스팅해서 사용해야 한다.
✔️ int 배열을 내림차순으로 정렬할 때
에러가 발생한다.
[Error] no suitable method found for sort(int[],java.util.Comparator<java.lang.Object>)
int형과 같은 primitive 타입은 Comparator가 없기 때문이다!(자바는 primitive 타입인지 아니면 객체인지에 따라 사용의 제약이 생긴다.)
해결책은
1. int[] -> integer[] 바꾼다.
2. 정렬 알고리즘으로 int[]를 정렬한다. -> 코테를 푸는 상황이므로 정렬 알고리즘을 사용하는 상황은 넘어가겠다.
1. int[] ➡️ integer[]
int[] array = {1, 3, 2, 5, 4};
Integer[] newArray = Arrays.stream(array).boxed().toArray(Integer[]::new);
Arrays.sort(newArray, Collections.reverseOrder());
2. int[] ➡️ List<Integer>
int[] array = {1, 3, 2, 5, 4};
List<Integer> list = Arrays.stream(array).boxed().collect(Collector.toList());
list.sort(Comparator.reverseOrder());
✔️ n의 약수를 구할 때는 루트 n까지만 확인해도 된다.
- n을 기준으로 좌우가 같으므로, 개수를 2개씩 더한다.
- 제곱근인 경우 개수를 1개만 더한다.
✔️ int, long value
- int: 부호있는 정수, 32bits(-2147483648 ~ 2147483647)
- long: 부호있는 정수, 64bits(-9223372036854775808 ~ 9223372036854775807)
overflow가 발생한다면(RuntimeException) 타입을 의심해볼 것!
https://school.programmers.co.kr/learn/courses/30/lessons/147355
이 문제도 참고!
✔️ substring method
문자열의 특정 부분을 자르는 상황이면, substring 메서드를 사용한다.
- public String substring(int startIndex)startIndex부터 끝까지의 문자열을 리턴한다.
- public String substring(int startIndex, int endIndex)startIndex(포함)부터 endIndex(불포함)까지 문자열을 리턴한다.
✔️ integer.bitcount
알고리즘 문제를 풀 때, 이진수로 변환하고 1의 개수를 세는 작업을 해야하는 상황이 있다.
이때마다 2로 나눠가면서 나머지로 이진수를 만들고, 1의 개수를 세는 작업을 했는데 bitcount라는 함수를 사용하면 간편하게 알 수 있다.
ex)
13 = 1101
Integer.bitCount(13); // 1의 개수인 3을 리턴한다.
✔️ 진법 변환
Integer.toBinaryString(int i), Integer.toOctalString(int i), Integer.toHexString(int i);
=> 10진수를 2진수, 8진수, 16진수로 변환한다.
Integer.parseInt(String s, int n진수);
=> 2진수, 8진수, 16진수 등을 10진수로 변환한다.
✔️ Java String reverse: 문자열 뒤집기
1. StringBuilder, StringBuffer 사용하기
String str = "abcde";
StringBuffer sb = new StringBuffer(str);
String reversedStr = sb.reverse().toString();
2. char[] 로 변환하여 뒤집기
String str = "abcde";
char[] arr = str.toCharArray();
char[] reversedArr = new char[arr.length];
for(int i = 0; i < arr.length; i++) {
revesredArr[arr.length-1-i] = arr[i];
}
String reversedStr = new String(reversedArr);
3. List로 변환하여 Collections.reverse(list) 이용하기
String str = "abcde";
char[] arr = str.toCharArray();
List<Character> list = new ArrayList<>();
for(char each : arr) {
list.add(each);
}
Collections.reverse(list);
✔️ Unicode로 변환하기
문자열에서 해당 문자가 숫자인지 아닌지 판단하는 방법 중에는 문자를 진수로 변환하여 나오는 값으로 판단하는 방법이 있다.
char => 10진수
System.out.println((int) 'A'); // 65
System.out.println((int) 'a'); // 97
System.out.println((int) '가'); // 44032
System.out.println((int) '나'); // 45208
10진수 => char
System.out.println((char) 65); // A
System.out.println((char) 97); // a
System.out.println((char) 44032); // 가
System.out.println((char) 45208); // 나
✔️ Stack 자료형을 잘 사용하자!
https://school.programmers.co.kr/learn/courses/30/lessons/12973
✔️ replace 함수 사용하기
https://school.programmers.co.kr/learn/courses/30/lessons/81301
String replace(CharSequence target, CharSequence replacement)
-> 바꾸고 싶은 문자로 문자열을 치환시킨다.
String replaceAll(CharSequence regex, CharSequence replacement)
-> 바꾸고 싶은 문자로 문자열을 전부 치환시킨다! replace와 다른 점은 첫번째 인자가 정규식이다.)
String replaceFirst(CharSequcne regex, CharSequence replacement)
-> 자신이 바꾸고 싶은 문자열이 처음으로 해당할 때만 치환시켜주는 기능을 한다.
✔️ custom 정렬
Comparator : Collections.sort의 2번째 인자로 쓴다. 2번째 인자는 Comparator 인터페이스의 compare를 구현해서 사용한다.
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student s1, Student s2) {
if(s1.age==s2.age)
return 0;
else if(s1.age>s2.age)
return 1;
else
return -1;
}
});
✔️ 배열 복사: Arrays.copyOf, Arrays.copyOfRange / System.arraycopy
- Arrays.copyOf(원본배열, 복사할 길이);
- Arrays.copyOfRange(원본 배열, 복사할 시작 인덱스, 복사할 끝인덱스);
복된 배열에서 값을 바꿔도 원본 배열의 값이 바뀌지 않는다.
System.arraycopy(Object src, int srcPos, Object dest, int destPost, int length)
- Object src: 복사하려는 원본
- int srcPost: Object src의 몇 번째 인덱스부터 복사할 것인지
- Object dest: Ctrl + V할 곳(붙여넣기하려는 대상)
- int destPost: Object dest의 몇 번째 인덱스부터 붙여넣기할 것인지
- int length: Object src에서 몇 개를 복사할 것인지
✔️ Character.isLetterOrDigit
Character.isLetter
isLetter(char ch): 파라미터의 char 값이 문자인지 여부를 판단하여 true/false로 반환
Character.isDigit
isDigit(char ch): 파라미터의 char 값이 숫자인지 여부를 판단하여 true/flase로 반환
Character.isLetterOrDigit
isLetterOrDigit(char ch): 파라미터 char값이 문자 혹은 숫자인지 여부를 판단하여 true/false로 반환
✔️ 정규표현식
[^a-zA-Z0-9] : ^이 안으로 들어가면 제외(부정)의 의미다. 영문자나 숫자로 시작할 수 없을 때
✔️ map
- 키와 값을 하나의 쌍으로 저장하는 방식(key-value)을 사용한다.
- 키(key): 실질적인 값(value)을 찾기 위한 이름 역할을 한다.
HashMap
- Map 컬렉션 클래스에서 가장 많이 사용된다.
- 해시 알고리즘(hash algorithm)을 사용하여 많은 양의 데이터를 검색해 속도가 빠르다.
- value에 null값 사용 가능하다.
주요 메서드
- put
- key, value로 값을 입력한다.
- key로 value를 찾는다.
- get
- key에 해당하는 값을 얻기 위해 사용한다.
- getOrDefault(Object key, V DefaultValue)
- key: 값을 가져와야하는 요소의 키
- defaultValue: 지정된 키로 매핑된 값이 없는 경우 반환되어야 하는 기본값
- 반환값: 찾는 key가 존재하면 해당 key에 매핑되어 있는 값을 반환하고, 그렇지 않으면 디폴트 값이 반환된다.
예시)
HashMap<String, Integer> map = new HashMap<>();
map.put(key, map.getOrDefault(key, 0) + 1);
// 풀이: key에서 값을 찾아 존재하면 해당 key에 1 더하고 그렇지 않으면, default값이 0에 1을 더해서 대입한다.
- containsKey
- Map에 해당 키(key)가 있는지 조사하여 결과값을 리턴한다.
- remove
- 맵(Map)의 항목을 삭제한다. key 값에 해당하는 아이템(key, value)을 삭제하고 value값을 반환한다.
- size
- Map의 갯수를 반환한다.
HashMap 정렬하기
HashMap은 정렬을 보장하지 않는다. HashMap 정렬이 필요하다면
- key값을 List로 저장한다.
- key값으로 value를 찾아서 정렬한다.
- 정렬된 key값 리스트를 가지고 정렬된 HashMap처럼 사용한다.
1) Key값을 기준으로 정렬하는 방법
- map의 keySet을 사용한다.
- 키 값으로 오름차순, 내림차순 정렬한다.
import java.util.*;
public class Sort {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("D", 3);
map.put("C", 2);
map.put("B", 4);
List<String> keySet = new ArrayList<>(map.keySet());
// 키 값으로 오름차순 정렬
Collections.sort(keySet);
for (String key : keySet) {
System.out.print("Key : " + key);
System.out.println(", Val : " + map.get(key));
}
/* 결과
Key : A, Val : 1
Key : B, Val : 4
Key : C, Val : 2
Key : D, Val : 3
*/
// 키 값으로 내림차순 정렬
Collections.reverse(keySet);
for (String key : keySet) {
System.out.print("Key : " + key);
System.out.println(", Val : " + map.get(key));
}
/* 결과
Key : D, Val : 3
Key : C, Val : 2
Key : B, Val : 4
Key : A, Val : 1
*/
}
}
2) Value 값을 기준으로 정렬하기
- map의 keySet을 이용한다.
- comparator를 사용하여 정렬한다.
import java.util.*;
public class Sort {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("D", 3);
map.put("C", 2);
map.put("B", 4);
List<String> keySet = new ArrayList<>(map.keySet());
// Value 값으로 오름차순 정렬
keySet.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return map.get(o1).compareTo(map.get(o2));
// return map.get(o2).compareTo(map.get(o1)); // Value 값으로 내림차순 정렬
}
});
for (String key : keySet) {
System.out.print("Key : " + key);
System.out.println(", Val : " + map.get(key));
}
/*
결과
Key : A, Val : 1
Key : C, Val : 2
Key : D, Val : 3
Key : B, Val : 4
*/
// Value 값으로 내림차순 정렬
// 위 comparator 람다 표현식으로
keySet.sort((o1, o2) -> map.get(o2).compareTo(map.get(o1)));
// value값으로 오름차순 정렬
// keySet.sort((o1, o2) -> map.get(o1).compareTo(map.get(o2)));
for (String key : keySet) {
System.out.print("Key : " + key);
System.out.println(", Val : " + map.get(key));
}
/* 결과
Key : B, Val : 4
Key : D, Val : 3
Key : C, Val : 2
Key : A, Val : 1
*/
}
}
+) hashmap key, value 출력하기
https://hianna.tistory.com/573
✔️ 소수점 올림, 반올림, 버림
소수를 반올림하여 n번째 자리까지 나타내는 방법을 알아본다.
Math.ceil();
소수점 올림
double pie = 3.141592;
/* 올림 */
System.out.println(Math.ceil(pie)); // 결과: 4
System.out.println(Math.ceil(pie*100)/100.0) // 결과: 3.15
Math.round();
반올림
double pie = 3.141592;
/* 반올림 */
System.out.println(Math.round(pie)); // 결과: 3
System.out.println(Math.round(pie*100)/100.0); // 결과: 3.14
System.out.println(Math.round(pie*1000)/1000.0); // 결과: 3.142
Math.floor();
버림
double pie = 3.141592;
/* 버림 */
System.out.println(Math.floor(pie)); // 결과: 3.0
System.out.println(Math.floor(pie*100)/100.0); // 결과: 3.14
System.out.println(Math.floor(pie*1000)/10000.0); // 결과: 3.141
String.format()
Math.round() 함수와 같이 소수점 n번째 자리까지 반올림하여 나타낸다.
double pie = 3.141592;
System.out.println(String.format("%.2f", pie)); // 결과: 3.14
System.out.println(String.format("%.3f", pie)); // 결과: 3.142
✔️ startsWith(), endsWith()
boolean startsWith(String prefix);
비교 대상 문자열이 입력된 문자열(prefix)값으로 시작되는지 여부를 확인하고 boolean(true/false)값으로 리턴한다.
String str = "자바 코딩";
System.out.println(str.startWith("자바")); // true
boolean endsWith(String suffix);
'자바 코딩'이라는 문자열이 '코딩이라는 문자열로 끝나는지 확인한다.
String str = "자바 코딩";
System.out.println(str.endsWith("코딩")); // true
✔️ PriorityQueue
들어간 순서에 상관없이 일정한 규칙에 따라 우선순위를 선정하고, 우선순위가 가장 높은 데이터가 가정 먼저 나오는 방식
// 우선순위 큐 선언, default: 오름차순으로 정렬
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
// 우선순위 큐 순서 변경, 내림차순으로 정렬
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
✔️ 최단거리 탐색 문제 풀이할 때
BFS로 풀이한다.
✔️ DP 문제 풀이할 때
계산 중간중간 값들을 mod로 나눠주는 것 잊지말기!!!
- top-down: 재귀 생각하기!
- bottom-up: 배열로 계속 더하는 것 생각!
✔️ ArrayList
- set: ArrayList에서 특정 인덱스에 값을 지정해줄 때 set 메서드를 사용한다.