본문 바로가기
언어/JAVA

[JAVA] 코테용 함수들

by 이민우 2023. 7. 8.
728x90
반응형

코딩테스트를 하다보면 List, Set, Map 등의 자료구조를 가져와서 써야할 때가 많다.

 

대부분은 평소 개발을 하거나 코딩테스트 연습 문제를 풀때는 딱히 인식을 하지 않아도 그냥 손가락이 알아서 쳐주는 함수들인데, 이상할 정도로 코딩 테스트만 가면 기억이 안나는 경우가 허다하다.

 

그래서 "언젠가는 정리해놓아야지..." 하다가 이제서야 정리를 한 번 해볼까 한다.

 

List

형변환

일단 가장 먼져 형변환 코드이다.

 

array <-> list

// array 
if(true) {
	// array > list
	String[] arr = new String[] {"a", "b", "c"};
	List<String> list = Arrays.asList(arr);

	System.out.println(list);
	    	
	// list > array
	String[] arr_cpy = list.toArray(new String[0]); // 0으로 저장하면 길이가 알아서 정해짐.
	System.out.println(Arrays.toString(arr_cpy));
}

set <-> list

// array 
if(true) {
	// set > list
	Set<String> set = new LinkedHashSet<>();
	set.add("a");
	set.add("b");
	set.add("c");
    		
	List<String> list = new ArrayList<>(set);
	    	
	System.out.println(list);

	// list > set
	Set<String> set_cpy = new LinkedHashSet<>(list);
	System.out.println(set_cpy);
    
}

 

 

다음으로 정렬 코드이다.

// array 
if(true) {
	List<String> list = new ArrayList<>();

	list.add("b");
	list.add("c");
	list.add("a");
    		
	// 오름차순
	list.sort(Comparator.naturalOrder());
	System.out.println(list);
	// 내림차순
	list.sort(Comparator.reverseOrder());
	System.out.println(list);
}

 

 

 

Set

형변환

array <-> set

// set 
if(true) {
	// array > set
	String[] arr = new String[] {"a", "b", "c"};
	Set<String> set = new LinkedHashSet<>(Arrays.asList(arr));

	System.out.println(set);

	// set > array
	String[] arr_cpy = set.toArray(new String[0]); // 마찬가지로 0으로 지정해야 자동으로 길이지정
	System.out.println(Arrays.toString(arr_cpy));

}

 

정렬은 기본적으로 TreeSet을 활용하면 자동으로 정렬돼서 들어간다.

// set 
if(true) {
	// 오름차순
	Set<String> treeSet = new TreeSet<>();

	treeSet.add("b");
	treeSet.add("c");
	treeSet.add("a");
    		
	System.out.println(treeSet);

	// 내림차순
	Set<String> treeSetRvs = new TreeSet<>(Comparator.reverseOrder());

	treeSetRvs.add("b");
	treeSetRvs.add("c");
	treeSetRvs.add("a");

	System.out.println(treeSetRvs);

}

하지만 TreeSet으로 사용할 수 없는 경우, List로 변환 후 다시 set으로 되돌리는 방법을 사용한다.

// set 
if(true) {
	// 오름차순
	Set<String> treeSet = new LinkedHashSet<>();

	treeSet.add("b");
	treeSet.add("c");
	treeSet.add("a");

	List<String> sortedList = new ArrayList<>(treeSet);
	sortedList.sort(Comparator.naturalOrder());
	Set<String> sortedSet = new LinkedHashSet<>(sortedList);

	System.out.println(sortedSet);

	// 내림차순
	sortedList.sort(Comparator.reverseOrder());
	sortedSet = new LinkedHashSet<>(sortedList);

	System.out.println(sortedSet);

}

 

Map

정렬

Map은 기본적으로 value를 기반으로 정렬을 해야하는 경우가 종종 존재한다.

그렇다고 value 기반 정렬만 볼 수는 없으니, key 기반 정렬도 한 번 봐보자.

 

우선 Map도 Set과 마찬가지로 HashMap이나 TreeMap을 사용하면 key 기반으로 자동 정렬이 된다.

// map 
if(true) {
	// 오름차순
	Map<Integer, String> treeMap = new TreeMap<>();
    
	treeMap.put(2, "a");
	treeMap.put(1, "c");
	treeMap.put(3, "b");

	System.out.println(treeMap);
    		
	// 내림차순
	treeMap = new TreeMap<>(Collections.reverseOrder());

	treeMap.put(2, "a");
	treeMap.put(1, "c");
	treeMap.put(3, "b");

	System.out.println(treeMap);

}

만약 TreeMap 외의 맵을 사용했다면 keySet을 불러와 정렬한다.

// map 
if(true) {
	// 오름차순
	Map<Integer, String> map = new HashMap<>();

	map.put(2, "a");
	map.put(1, "c");
	map.put(3, "b");

	Set<Integer> mapKey = map.keySet();
	List<Integer> sortedKey = new ArrayList<>(mapKey);
	sortedKey.sort(Comparator.naturalOrder());
	mapKey = new LinkedHashSet<>(sortedKey);

	System.out.println(mapKey);

	// 내림차순
	mapKey = map.keySet();
	sortedKey = new ArrayList<>(mapKey);
	sortedKey.sort(Comparator.reverseOrder());
	mapKey = new LinkedHashSet<>(sortedKey);

	System.out.println(mapKey);
}

 

다음은 Value 기준 정렬이다.

// map 
if(true) {
	// 오름차순
	Map<Integer, String> map = new LinkedHashMap<>();

	map.put(2, "a");
	map.put(1, "c");
	map.put(3, "b");
    
	// entry 리스트로 변환
	List<Map.Entry<Integer, String>> mapList = new ArrayList<>(map.entrySet());
	// sort
	mapList.sort(Map.Entry.comparingByValue());
	// 새로운 map에 저장
	Map<Integer, String> sortedMap = new LinkedHashMap<>();
	for(Map.Entry<Integer, String> entry : mapList) {
		sortedMap.put(entry.getKey(), entry.getValue());
	}

	System.out.println(sortedMap);
    		
	// 내림차순
	mapList = new ArrayList<>(map.entrySet());
	// sort
	mapList.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));
	// 새로운 map에 저장
	sortedMap = new LinkedHashMap<>();
	for(Map.Entry<Integer, String> entry : mapList) {
		sortedMap.put(entry.getKey(), entry.getValue());
	}

	System.out.println(sortedMap);

}

 

 

PriorityQueue

PriorityQueue는 우선순위가 정해진 큐로, 데이터가 들어올 때마다 자동으로 정렬이 되는 리스트 정도로 생각하면 된다.

주로 최대/최소 힙 구현에 사용된다.

// priority queue
if(true) {
	// 최소힙 구현
	PriorityQueue<Integer> pq = new PriorityQueue<>(Comparator.reverseOrder());

	pq.add(2);
	pq.add(3);
	pq.add(1);

	while(!pq.isEmpty()) {
		System.out.print(pq.poll() + " ");
	}

	System.out.println();
	// 최대힙 구현
	pq = new PriorityQueue<>();

	pq.add(2);
	pq.add(3);
	pq.add(1);

	while(!pq.isEmpty()) {
		System.out.print(pq.poll() + " ");
	}
}

 

 

Queue

BFS에서 자주 사용되는 Queue는 FIFO 방식의 리스트이다.

// queue
if(true) {
	Queue<Integer> q = new LinkedList<>();

	q.add(2);
	q.add(3);
	q.add(1);

	while(!q.isEmpty()) {
		System.out.print(q.poll() + " ");
	}
}
728x90
반응형

'언어 > JAVA' 카테고리의 다른 글

Checked Exception과 Unchecked Exception  (0) 2024.05.08
1970년 01월 01일 00시 00분 00초  (0) 2023.03.17
JDBC 사용법  (0) 2022.07.25
리눅스 OS에 명령어 보내기  (0) 2022.07.21
[JAVA] 온점 단위 Split  (0) 2022.03.10