본문 바로가기
취업

👩‍💻 자바 코테 cheat sheet(최신 업데이트: 10.18)

by 위대한초밥V 2023. 9. 8.

헷갈리는 개념들 모아모아 정리하기!

+) 참고하면 좋을 블로그: 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

이 문제도 참고!

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

✔️ 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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

✔️ replace 함수 사용하기

https://school.programmers.co.kr/learn/courses/30/lessons/81301

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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 정렬이 필요하다면

  1. key값을 List로 저장한다.
  2. key값으로 value를 찾아서 정렬한다.
  3. 정렬된 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 메서드를 사용한다.
반응형