프로그래밍/java

코딩테스트를 위한 자바 자료구조 및 메서드 요약

승민아 2024. 4. 13. 11:50

C++로 알고리즘을 풀고 공부했는데...

우아한 테크 캠프 모집을 봤는데 코딩 테스트 언어로 Java만 지원 받는다는 ... 충격적인...

그래서 백엔드를 희망하기도해서 이제 알고리즘 공부를 Java로 시작하기로 다짐했다..

 

당장 코딩 테스트인데 자바로 기본적인 자료구조 사용하는 법을 정리하고자 한다..

 

자료구조 사용을 위해 다음을 import하면 된다.

import java.util.*;

 

Stack

Stack<Integer> s = new Stack<>(); // 생성

s.push(1); // 삽입

s.pop(); // 삭제

s.peek(); // 조회

s.empty(); // 크기 조회

 

Queue

Queue<Integer> q = new LinkedList<>(); // 생성

q.add(1); // 삽입

q.remove(); // 삭제

q.peek(); // 조회

q.size(); // 크기 조회

 

C++에서 사용한 Pair<>, make_pair()는 어떻게 자바에서 사용할 수 있을까?

아래의 Queue에 사용한 예시를 보자.

import java.util.*;
class Solution {
    
    class Pair {
        String word;
        int cnt;
        
        public Pair(String word, int cnt) {
            this.word = word;
            this.cnt = cnt;
        }
    }
    
    public int solution(String begin, String target, String[] words) {
        Queue<Pair> q = new LinkedList<>();
        q.add(new Pair(begin, 0));
        
        while(q.size() != 0) {
            String word = q.peek().word;
            int cnt = q.peek().cnt;
            q.remove();  
        }
}

클래스와 생성자를 사용한다. 필드의 접근은 peek().필드명 으로 접근한다.

 

Stack에서는 push(), pop()이고

Queue에서는 add(), remove()인것을 기억하자!

 

List

List<String> list = new ArrayList<>(); // 생성

list.add("hello"); // 삽입

list.remove(인덱스 또는 Object); // 삭제

list.get(인덱스); // 조회

list.size(); // 크기 조회

 

만약 list에 담긴 원소가 1개뿐인데 2번째 원소에 접근하기위해

list.get(1);를 작성하면 null을 반환하는 것이 아니라 바로 NullException이 터져버리니 size() 체크를 잘해주자.

 

Arrays.sort

[[4,5],[4,8],[10,14],[11,13],[5,12],[3,7],[1,4]]

가 int[][]에 들어왔을때.

예를 들어 [4,5]에서 2번째 값을 기준으로 정렬할때 다음과 같이 정렬한다.

 

int[][] targets;
        
Arrays.sort(targets, (o1, o2) -> {
    return o1[1] - o2[1]; // 반환값이 boolean이 아닌 int여야함
});

 

List.sort

List<Integer> list = new ArrayList<>();
list.sort((o1, o2) -> {
    return o2 - o1; // 내림차순
});

int[]와 같은 배열은 Arrays.sort를 사용하는것과 달리

List와 같은 컬렉션은 레퍼런스의 sort() 메서드를 사용한다.

 

내림차순을 원한다면 o2 - 01

오름차순을 원한다면 o1 - o2를 해주자.

 

Map

Map<String, Integer> m = new HashMap<String, Integer>(); // 생성

m.put("hello", 1); // 삽입

m.remove(키 "hello"); // 삭제

m.get(키 "hello"); // 조회

m.size(); // 크기 조회

 

Map : keySet() -> Array

List<String> list = new ArrayList<>(m.keySet());

Map의 키들을 ArrayList로 만들 수 있다.

 

 

Map : values() -> Array

List<String> list = new ArrayList<>(m.values());

Map의 Value들을 ArrayList로 만들 수 있다.

 

length 필드, length(), size() 차이

length 필드는 배열의 길이를 알고자할때 사용한다.

String[] s, int[] arr와 같은 배열에서 길이를 알때 사용한다.

 

예를들어 String 배열 또는 int 배열을 반목문을 돌리고자할때

String[] s;

for(int i=0; s.length; i++) {...}

위와 같이 사용한다.

 

length() 메서드는 문자열의 길이를 알고자할때 사용한다.

먼저 String[] s로 배열이 있을때 각 배열의 문자열의 문자 하나하나를 탐색할때 다음과 같이 한다.

String[] s;
for(int i=0; i<s.length; i++) {
    for(int j=0; j<s[i].length(); j++) {
        ...
    }
}

 

size() 메서드는 컬렉션 타입의 길이를 알고자할때 사용한다.

List<Integer> list = new ArrayList<>();
for(int i=0; i<list.size(); i++) {
    ...
}

 

String 문자열의 문자에 접근할때 주의하자.!

String str = "abc"일때 str[0]은 못함 str.charAt(0)